public static void noVirtualCast() { NoVirtualItem iItem = new NoVirtualItem("AlmaItem", 10, 1000); NoVDVD iDVD = new NoVDVD("AlmaDVD", 20, 500.0, DVDType.LayerOne); NoVirtualItem iItemDVD = new NoVDVD("AlmaDVD", 20, 500.0, DVDType.LayerOne); // DVD-bol Item-et (cast nelkul, mert mindig lehetseges) NoVirtualItem iItem2 = iDVD; System.Console.WriteLine(iItem2.play()); // Play NoVirtualItem // Item-bol DVD-t (cast szukseges, mert nem biztos, hogy lehetseges!) NoVDVD iDVD2 = (NoVDVD)iItemDVD; System.Console.WriteLine(iDVD2.play()); // Play NoVDVD NoVirtualItem iItemVHS = new NoVVHS("AlmaVHS", 20, 500.0, VHSType.Size240); // NoVDVD iDVD3 = (NoVDVD)iItemVHS; // InvalidCastException // biztonsagos megoldas if (iItemVHS is NoVDVD) { NoVDVD iDVD3 = (iItemVHS as NoVDVD); // vagy: NoVDVD iDVD3 = (NoVDVD)iItemVHS; } // tudjuk, hogy az iItemDVD-nek van DiskType-ja, de nem tudjuk kiirni: // System.Console.WriteLine(iItemDVD.DiskType); // de igy viszont mar igen System.Console.WriteLine((iItemDVD as NoVDVD).DiskType); }
public static void noVirtualDemo() { // minden metodus a NoVirtualItem osztalyban fut (egyertelmu) System.Console.WriteLine("\n### (1) NoVirtualItem iItem = new NoVirtualItem()"); NoVirtualItem iItem = new NoVirtualItem("AlmaItem", 10, 1000); System.Console.WriteLine(iItem.play()); // Play NoVirtualItem System.Console.WriteLine(iItem.handle()); // Play NoVirtualItem // A play() egyertelmuen a NoVDVD-ben fut, de a handle() esete mar nem ennyire egyertelmu System.Console.WriteLine("\n### (2) NoVDVD iDVD = new NoVDVD()"); NoVDVD iDVD = new NoVDVD("AlmaDVD", 20, 500.0, DVDType.LayerOne); System.Console.WriteLine(iDVD.play()); // Play NoVDVD --> DVD // Itt a Play a NoVirtualItem osztalyban fut! OK: a handle() altel hivott play() metodust eloszor a // NoVirtualItem osztalyban talalja meg a fordito, mert a handle() metodus is ott van! System.Console.WriteLine(iDVD.handle()); // Play NoVirtualItem (es igy nem jelenik meg a DiskType..) // minden metodus a NoVirtualItem osztalyban fut --> ez a nem virtualis metodusok hasznlatanak egyik legnagyobb hatranya // egyetlen elonye: gyorsabb mint a virtualis metodusok hivasa (gyorsabb, mert kiszamithato, egyertelmu a forditonak. Embernek mar kevesbe..) System.Console.WriteLine("\n### (3) NoVirtualItem iItemDVD = new NoVDVD()"); NoVirtualItem iItemDVD = new NoVDVD("AlmaDVD", 20, 500.0, DVDType.LayerOne); System.Console.WriteLine(iItemDVD.play()); // Play NoVirtualItem System.Console.WriteLine(iItemDVD.handle()); // Play NoVirtualItem System.Console.WriteLine("\n### (4) NoVDVD iDVD = new NoVDVD() --> NoVirtualItem"); Program.noVirtualPrint(iDVD); // igy ugyanazt erjuk el, mint a 3. esetben }
public static void noVirtualPrint( NoVirtualItem item ) { System.Console.WriteLine(item.play()); System.Console.WriteLine(item.handle()); System.Console.WriteLine(); }