Virtuális módszerek Sea-Sharpban

Ebben a leckében olyan eszközöket fogunk megvizsgálni, amelyekkel a C-Sharp virtuális módszereiben polimorfizmust hajthatunk végre, új módszereket definiálva.

A virtuális módszer olyan módszer, amely az örökös osztályában újradefiniálható.

A módszer újradefiniálása a végrehajtását az örökös osztályában változtatja meg. A módszer újradefiniálása, másként fog működni az alap osztályban és az örökösei osztályban, azonos névvel és érveléssel, valamint a visszatérési típussal.

A virtuális módszer a virtuális kulcsszó használatával jelenik meg:

[access modifier] virtuális [típus] [módszer neve] ([argumentumok])
// a módszer teste
>


* A statikus módszer nem lehet virtuális.

A virtuális módszer kijelölésével most újra lehet definiálni az örökös osztályában. Ehhez használja a kulcsszó felülírását:

[access modifier] felülírja [típus] [módszer neve] ([argumentumok])
// az új módszer teste
>


Ezt a példát vegye figyelembe. Van az osztályú ember. és még kettőt örökölnek - Diák és diák. Az alap osztályban van egy virtuális ShowInfo módszer. amely információkat jelenít meg az objektumról. A hallgatói és hallgatói osztályoknál ez a módszer felülbírálható annak érdekében, hogy az alapinformáció kimenetéhez hozzáadja az adott osztályhoz tartozó konkrét értéket:

osztályos személy
nyilvános karakterlánc
közönségkapcsolat

nyilvános hallgató (string név, int age, string hsName)
. bázis (név, életkor)
HighSchoolName = hsName;
>
public override érvénytelen ShowInfo () // módszer felülbírálása
\ N "+" Age: "+ Age +" \ n "+" Az egyetem neve: "+ HighSchoolName +" \ n ");
>
>
osztályos diák. személy
nyilvános karakterlánc

közoktató (karakterláncnév, int-kor, karakterlánc)
. bázis (név, életkor)
Form = forma;
>
public override érvénytelen ShowInfo () // módszer felülbírálása
\ N "+" Kategória: "+ Form +" \ n "): \ n" "" Név: "+ Név +" \ n "+" Korosztály:
>
>

statikus érvénytelen Main (string [] args)
lista személyek = új lista();
Add (Új személy ("Basil", 32));
Add (Új tanuló ("Andrew", 21, "Moszkvai Állami Egyetem"));
Add (új diák ("Elena", 12, "7-B"));

foreach (személy személyek p)
p.ShowInfo ();


A fő módszerben létrehozunk egy listát azokról az emberekről, akikhez egyszerűen hozzá kell adnunk egy személyt, diákot és diákot, majd a ShowInfo () metódusával hívjuk fel őket. A munka eredménye az információ típusa az objektum típusának megfelelően.

És most felmerülhet a kérdés - és mi fog történni, ha eltávolítja a felülbírálatot a kulcsszavak virtuális elhagyásával és felülbírálásával. Ebben az esetben a bázis osztályban és az osztályban az utódok a ShowInfo-val azonos névvel rendelkeznek. A program működni fog, de minden egyes objektumról, függetlenül attól, hogy ez csak egy személy vagy egy diák / diák, az információ csak egyszerű személyként fog megjelenni (a ShowInfo módszerét a bázis osztálytól fogják hívni).

Ez javítható az objektumtípusok ellenőrzésével, és a típusok leadásával hívja meg a kívánt ShowInfo metódust:

foreach (személy személyek p)
ha (p a diák)
(Hallgató) p) .ShowInfo ();
ha p (P = Pupil)
((Pupil) p) .ShowInfo ();
egyébként p.ShowInfo ();
>


Csak itt, mennyi felesleges kód jelenik meg. Úgy gondolom, világossá válik, hogy virtuális módszereket és újradefiniálást kapunk.

Az alapmód felhívása

Előfordul, hogy az alap osztályban újradefiniált módszer funkcionalitása kevéssé különbözik attól a funkcionalitástól, amelyet az örökös osztályban kell meghatározni. Ebben az esetben újradefiniáláskor ezt a módszert először az alaposztályból hívhatjuk, majd hozzáadhatjuk a szükséges funkciókat. Ez a kulcsszóbázis használatával történik:

nyilvános virtuális üres ShowInfo () // ShowInfo személyi osztályban
Console.WriteLine ("Név:" + Név);
Console.WriteLine ("Kor:" + Kor);
>

nyilvános felülírás érvénytelen ShowInfo () // ShowInfo az osztályban Diák
base.ShowInfo (); // hívja az ShowInfo ()
Console.WriteLine ("Egyetemi név:" + HighSchoolName);
>

Hozz létre három osztályt: Warrior, Warrior-in-the-tüdő és Warrior-in-Heavy Armor. Mindegyiküknek van az a tulajdonsága, az Élet száma, valamint a Get_Warning módszernek, amely argumentumként veszi figyelembe a kapott kár értékét. Ezt a módszert különböző módon alkalmazzuk minden típus esetében, különböző arányokat határozva meg a páncél típusától függően az egészség levonási képletében.

Absztrakt osztályok, módszerek és tulajdonságok a C-Sharp-ban

Ebben a leckében továbbra is a polimorfizmus eszközeivel foglalkozunk. A sorban absztrakt osztályok, módszerek és tulajdonságok vannak.

Egy absztrakt osztály egy olyan osztály, amelyet a kulcsszó elvonásával deklaráltak:

absztrakt osztály [class_name]
// test
>


Ez az osztály a következő tulajdonságokkal rendelkezik:
- nem hozhat létre absztrakt osztály példányait;
- Egy absztrakt osztály tartalmazhat absztrakt módszereket / tulajdonságokat és szokásosakat is;
- az utódok osztályában végre kell hajtani az absztrakt módszert és az alap osztályban deklarált tulajdonságokat.

Miért van szükségünk elvont osztályokra?

Abban az absztrakt osztályban, amelyből senki sem örökli, nincs értelme, mivel lehetetlen létrehozni példányait. Absztrakt osztályban általában több entitás egy közös része valósul meg, vagy más szavakkal - absztrakt entitás, amely objektumként nem létezhet, és ez a rész szükséges az örökösök osztályaiban. Speciális példák fognak követni.

Az absztrakt módszerek megértése nem lesz nehéz az Ön számára, ha már ismerte a virtuális módszereket.

Az absztrakt módszer egy olyan módszer, amelynek végrehajtása nem az alap osztályban történik, és meg kell, hogy valósuljon meg az utódosztályban. Egy absztrakt módszer csak absztrakt osztályban deklarálható.

Mi a különbség a virtuális és az absztrakt módszer között?

- A virtuális módszer saját végrehajtását képes lehet az alap osztályban, absztrakt - nem (a test üres);
- Az absztrakt módszert az utódosztályban kell végrehajtani, a virtuális módszert nem szabad újra definiálni.

[hozzáférési módosító] absztrakt [típus] [módszer neve] ([érvek]);

Az absztrakt módszer végrehajtása az örökös osztályban ugyanaz, mint a módszer felülírása - az override kulcsszó használata:

[access modifier] felülírja [típus] [módszer neve] ([argumentumok])
// a módszer végrehajtása
>

Az absztrakt tulajdonságok létrehozása nem különbözik a módszertől:

[hozzáférési módosító] absztrakt [típus] [tulajdonságnév]

Végrehajtás az osztály-örökösben:

Példaként egy olyan programot adok neked, amely hasonló volt a virtuális módszerek előző leckéjéhez, ahol megjelent egy személy / diák / iskolai kolléga. Most lesz állatok. Ezután létrehozhatunk egy olyan személyt, akinek nincs státusza (nem diák, nem iskolás), akinek van néhány információja, és most az állatok absztrakt lényege lesz. melynek tárgya nem hozható létre, és nincs értelme, mivel minden állat különleges alárendeltség lesz - egy emlős, egy hal, egy madár:

absztrakt osztály Állat
nyilvános karakterlánc
nyilvános karakterlánc típus

foreach (állatok állatokban)
animal.GetInfo ();


A végén még mindig dolgozunk az állatok egy listáján, és hívjuk a GetInfo () egyik módszerét. információt kapunk a megfelelő állatról.

Amikor megpróbálunk egy absztrakt osztály objektumát létrehozni, akkor a "ConsoleApplication1.Animal" hibaüzenet jelenik meg: "Nem hozható létre az absztrakt osztály vagy felület példánya":

Állati állatok = új állatok (); // hiba

Hozz létre egy absztrakt osztályt Man. legyen egy Name tulajdonság és egy absztrakt módszer a Hello () kifejezésre. ebből az osztályból több örökös lesz, aki az állampolgárságot képviseli (orosz, ukrán, amerikai). Ezt úgy kell elérned, hogy amikor felhívod a HelloAction () metódust, megjelenik egy üdvözlet a megfelelő állampolgárság nyelvén (Hi, Привіт, Hi.).

Kapcsolódó cikkek