Metode virtuale în Sea-Sharp

În această lecție vom analiza câteva instrumente cu care puteți implementa polimorfismul în C-Sharp - metode virtuale, metode de redefinire.

O metodă virtuală este o metodă care poate fi redefinită în clasa moștenitorului.

Redefinirea unei metode își schimbă implementarea în clasa moștenitorului. Redefinind metoda, aceasta va funcționa diferit în clasa de bază și în clasa moștenitorilor, cu același nume și argumente, și tipul de returnare.

Metoda virtuală este declarată utilizând cuvântul cheie virtual:

[modificator de acces] tip [virtual] [nume de metoda] ([argumente])
// corpul metodei
>


* Metoda statică nu poate fi virtuală.

Declarând metoda virtuală, o putem redefini acum în clasa moștenitorului. Pentru a face acest lucru, utilizați suprascrierea cuvântului cheie:

[modificator acces] suprascrie [type] [nume de metoda] ([arguments])
// corpul noii metode
>


Luați în considerare acest lucru pentru un exemplu. Avem clasa Omul. și de la el încă două sunt moștenite - Student și Student. În clasa de bază, există o metodă virtuală ShowInfo. care afișează informații despre obiect. În clasele Student și Student, această metodă este suprascrisă pentru a adăuga la rezultatul informațiilor de bază o metodă specifică referitoare la clasa corespunzătoare:

persoană de clasă
nume de șir public
public int Age

public Student (numele șirului, int age, string hsName)
. baza (nume, vârstă)
HighSchoolName = hsName;
>
suprascriere publică void ShowInfo () // override method
Console.WriteLine ("Student \ nName:" + Nume + "\ n" + "Vârsta:" + Vârstă + "\ n" + "Numele universității:" + HighSchoolName + "\ n");
>
>
clasa Elev. persoană
formular public de șir

public pupil (numele șirului, int age, forma de șir)
. baza (nume, vârstă)
Formă = formă;
>
suprascriere publică void ShowInfo () // override method
Console.WriteLine ("Student (i) \ n" Nume: "+ Nume +" \ n "+" Vârsta: + + + +;
>
>

static void Principal (șir [] args)
listă persoane = Listă nouă();
persons.Add (persoană nouă ("Basil", 32));
persons.Add (nou student ("Andrew", 21, "Universitatea de Stat din Moscova"));
persoane.Add (elev nou ("Elena", 12, "7-B"));

foreach (persoană p în persoane)
p.ShowInfo ();


În principala metodă, vom crea o listă de persoane cărora le adăugăm pur și simplu o persoană, student și student, apoi afișăm informații despre fiecare dintre ele apelând metoda ShowInfo (). Rezultatul lucrării este rezultatul informațiilor în funcție de tipul obiectului.

Și acum se poate ivi întrebarea - și ce se va întâmpla dacă eliminați suprascrierea prin abandonarea cuvintelor cheie virtuale și suprascrierea. În acest caz, în clasa de bază și în clasă succesorul va avea metode cu același nume ca ShowInfo. Programul va funcționa, dar pentru fiecare obiect, fie că este vorba doar de o persoană sau de un student / student, informațiile vor fi afișate doar ca o persoană simplă (se va apela metoda ShowInfo din clasa de bază).

Acest lucru poate fi corectat prin adăugarea de cecuri la tipul de obiect și prin turnarea tipurilor, apelați metoda ShowInfo dorită:

foreach (persoană p în persoane)
dacă (p este student)
(Student) p) .ShowInfo ();
altfel dacă (p este elevul)
((Elev) p) .ShowInfo ();
altceva p.ShowInfo ();
>


Doar aici, cât de mult din acest lucru apare codul inutil. Cred că devine clar că ni se dau metode virtuale și redefinire.

Apelarea metodei de bază

Se întâmplă că funcția unei metode care este redefinită în clasa de bază diferă puțin de funcționalitatea care trebuie definită în clasa moștenitorului. În acest caz, când redefinim, putem numi această metodă mai întâi din clasa de bază și apoi adăugăm funcționalitatea necesară. Acest lucru se face folosind baza de cuvinte cheie:

public virtual void ShowInfo () // ShowInfo în clasa Persoane
Console.WriteLine ("Nume:" + Nume);
Console.WriteLine ("Varsta:" + Vârsta);
>

suprascriere publică void ShowInfo () // ShowInfo în clasa Student
base.ShowInfo (); // apelați metoda de bază ShowInfo ()
Console.WriteLine ("Numele universității:" + HighSchoolName);
>

Creați trei clase: Războinic, Războinic în plămâni și Armură războinică. Toți au proprietatea - Number of Life, precum și metoda Get_Warning, care ia ca argument valoarea de daune pe care le primește. Implementați această metodă în moduri diferite pentru toate tipurile, stabilind diferite rapoarte în funcție de tipul de armură în formula de deducere a sănătății.

Rezumate clase, metode și proprietăți în C-Sharp

În această lecție vom continua să luăm în considerare cu dvs. instrumentele de polimorfism. În coadă avem clase abstracte, metode și proprietăți.

O clasă abstractă este o clasă declarată cu cuvântul cheie abstract:

clasă abstractă [class_name]
// corp
>


Această clasă are următoarele caracteristici:
- nu puteți crea instanțe ale unei clase abstracte;
- O clasă abstractă poate conține atât metode / proprietăți abstracte, cât și cele obișnuite;
- în clasa succesorului, trebuie implementate toate metodele și proprietățile abstracte declarate în clasa de bază.

De ce avem nevoie de clase abstracte?

Într-o clasă abstractizată în sine, din care nimeni nu moștenește, nu are sens, deoarece este imposibil să-i creăm instanțele. Într-o clasă abstractă, de obicei se realizează o parte comună a mai multor entități sau, cu alte cuvinte, o entitate abstractă care, ca obiect, nu poate exista, iar această parte este necesară în clasele moștenitorilor. Exemple specifice vor urma.

Înțelegerea metodelor abstracte nu va fi dificilă pentru dvs. dacă ați devenit deja familiarizat cu metodele virtuale.

O metodă abstractă este o metodă care nu are implementarea ei în clasa de bază și trebuie implementată în clasa succesoare. O metodă abstractă poate fi declarată doar într-o clasă abstractă.

Care este diferența dintre o metodă virtuală și o metodă abstractă?

- O metodă virtuală poate avea propria implementare în clasa de bază, abstract - nu (corpul este gol);
- Metoda abstractă trebuie implementată în clasa succesoare, metoda virtuală nu trebuie redefinită.

[modificator de acces] abstract [type] [method name] ([arguments]);

Punerea în aplicare a metodei abstracte în clasa moștenitorului este aceeași cu depășirea metodei - folosind cuvântul cheie suprascris:

[modificator acces] suprascrie [type] [nume de metoda] ([arguments])
// implementarea metodei
>

Crearea de proprietăți abstracte nu este mult diferită de metodele:

[modificator de acces] abstract [type] [nume proprietate]

Implementarea în clasa-moștenitor:

De exemplu, vă voi da un program similar cu cel din lecția anterioară despre metodele virtuale, în care au fost afișate informații despre o persoană / student / elev. Acum vor exista animale. Apoi am putea să creăm o persoană fără statut (nu un student, nu un elev școlar) care să aibă niște informații și acum vom avea o esență abstractă a animalului. a cărui obiect nu poate fi creat și nu are sens, deoarece fiecare animal va fi o sub-regiune specifică - un mamifer, un pește, o pasăre:

clasa abstractă Animal
nume de șir public
public string Type

foreach (Animal animal la animale)
animal.GetInfo ();


În cele din urmă, lucrăm încă cu o singură listă de animale și apelând o metodă GetInfo (). obținem informații despre animalul corespunzător.

Când încercăm să creăm un obiect al unei clase abstracte, primim eroarea "ConsoleApplication1.Animal": "Nu se poate crea o instanță a clasei sau interfeței abstracte":

Animal animal = animal nou (); // eroare

Creați o clasă abstractă Omul. să fie o proprietate Nume și o metodă abstractă de spus Hello (). din această clasă vor fi mai mulți moștenitori care reprezintă naționalitatea (rusă, ucraineană, americană). Ar trebui să obțineți acest lucru astfel încât atunci când apelați metoda HelloAction (), este afișat un salut în limba naționalității corespunzătoare (Hi, Привіт, Hi.).

Articole similare