C#, polimorfizmus. Több helyen is olvastam róla, többször kipróbáltam és mégsem értem. A lenti kód alapján kérhetek segítséget?
Már többször is nekifutottam és több helyen is olvastam róla. Valahogy nem áll össze.
Tegnap este készítettem egy példát magamnak:
https://pastebin (pont) com/XRrBm8ci
Szerettem volna látni, melyik metódus hívódik meg, mi hogy működik. Részben TALÁN sikerült.
Base class típusú objektumot hozunk létre, ez praktikus lehet például akkor, ha tömböt vagy listát töltünk fel és előre nem tudjuk, hogy melyik objektum milyen típusú lesz. Viszont az inherited konstruktorait hívjuk meg, így voltaképp a példány maga az inherited class típusú lesz.
Ha a származtatott osztály felülírta a metódust, az övé hívódik meg, ha nem vagy nem is implementálta, akkor a base.
Ugye valami ilyesmi? :(
Nagyjából ennyi a lényeg:
class Base {
public virtual void Print() => Console.WriteLine("From base");
}
class Derived : Base {
public override void Print() => Console.WriteLine("From derived");
}
Base x = new Derived();
x.Print(); //From derived
Ha nem virtual a metódus:
class Base {
public void Print() => Console.WriteLine("From base");
}
class Derived : Base {
public new void Print() => Console.WriteLine("From derived");
}
Base x = new Derived();
x.Print(); //From base
Vagyis, ha override-olsz, mindig a leszármazott osztály metódusa hívódik meg. Ha nem, akkor az ősosztályé - mert nem felülírod, hanem csak elrejted az ősosztály implementációját.
"Ha nem (overrdeolsz), akkor az ősosztályé - mert nem felülírod, hanem csak elrejted az ősosztály implementációját."
Aanyaaaaa miiiijjééééért és amúgy hol használatos ez az egész?
Mondok egy valós példát. Képzeld el hogy csinálsz valami autóversenyes játékot. Amikor kialszanak a lámpák, minden autót elkell indítani a rajt helyéről. Akkor nem meghívogatjuk minden autón a Start() metódust, hanem ezt csináljuk.
public class Car
{
public virtual Start();
}
public class Ferrari : Car
{
public override Start()
{
Console.WriteLine("A ferrari elindult");
}
}
public class McLaren: Car
{
public override Start()
{
Console.WriteLine("A McLaren elindult");
}
}
var list = new List<Car>();
list.Add(new Ferrari);
list.Add(new McLaren);
foreach car in list
{
car.Start(); //És itt nem az ősoszály Start metódusa fog meghívodni, amit nem is implementáltam, mert fölösleges, hanem a leszármazottaké. Tehát a program elfogja indítani a Mclaren-t meg a Ferrarit is, anélkül hogy HÁRDKÓDOLNI kellet volna hogy ferrari.Start(); McLaren.Start();
}
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!