Gestionați un număr mare de clase disparate este dificil. Puteți fi manipulate prin compilarea și clasament clase cu această problemă. adică combinarea comune mai multor clase de proprietate din aceeași clasă și folosind-o ca bază. Această oportunitate prevede mecanismul de moștenire.
Moștenirea este utilizat pentru următoarele obiective interconectate.
1) excluderea programelor repetate de fragmente de cod;
2) program de modificare simplificare;
3) să faciliteze crearea de noi programe pe baza celor existente.
În plus. Moștenirea este o oportunitate unică de a folosi facilitățile. codul sursă nu este disponibil. dar doriți să faceți modificări.
În plus față de moștenire în această secțiune, vom discuta astfel de concepte OOP importante cum ar fi polimorfismul și încapsulare. care sunt de asemenea implicate în formarea ierarhiei clasei.
Să ne amintim sintaxa de clasă.
[Atributele] [calificative] Clasa de nume de clasă _ [: strămoș]
În descrierea numelui clasei părinte al clasei este scris în antetul după colon. Class. care este moștenită. Se numește bază. Class. care moștenește. Se numește derivați. Clasa derivată moștenește toate variabilele. metode. proprietăți. operatori și indexatorii. definită în clasa de bază. în afară. elemente unice pot fi adăugate la clasa derivată. sau redefinit cele existente. În cazul în care nu este specificat în mod explicit numele strămoșilor. acesta este considerat a fi stramosul clasei de bază pentru toate tipurile de date în C #, t. e. tipul de bject.
Luați în considerare exemplul claselor de moștenire de forme geometrice. In PointPlane crea o clasă (un punct în plan) ca clasa de bază și o clasă derivată de la
PointPlane - clasa PointSpace (un punct în spațiu):
folosind System; Spațiu de nume myprogram
public class PointPlane // clasa de bază - un punct de pe planul
public int x; publice int y; void Arata publice ()
Console.WriteLine ( "(,)", x, y);
int y = (int) ob; // Console.WriteLine unboxing ( "y =", y);
Rezultatul fragmentului de program.
În cazul nostru, următoarea comandă va fi permisă.
PointPlane = new PointSpace PUNCTELOR DE (1,2,3);
Mai mult decât atât. t. Pentru a. Tipul de obiect este baza pentru toate tipurile de date. Devine valabilă următoarea secvență de comenzi.
OB1 obiect = new PointPlane (4, 5); OB2 obiect = new PointSpace (6, 7, 8);
Apare o eroare atunci când încercați să aplicați metoda Show. De exemplu. echipă
în loc de așteptat (1, 2, 3) ne va arăta (1, 2). O echipă.
nu fie în măsură să-și îndeplinească. t. Pentru a. Pentru obiect de clasă arată metoda nu este definită.
Să recunoaștem. de ce în loc de (1, 2, 3) avem (1, 2). Așa cum am menționat mai devreme. Toate metodele dintr-o clasă sunt singur exemplar în memorie și sunt utilizate de către toate obiectele din aceeași clasă împreună. Această decizie este destul de logic. pentru că dacă avem 1000 de tip obiect PointPlane, apoi de 1000 de ori duplicat de cod arată metoda nu are sens.
Ca rezultat. în cazul atribuirii unei trimiteri la obiectul de clasă PointPlane PointSpace există un conflict între cele două tabele de metode - clasa de bază și o clasă - un descendent.
Deoarece descendenții clasei de bază poate fi mulți (inclusiv descendenții treia și niveluri superioare), și de căutare prin toate metodele posibile de tabele este un proces destul de îndelungat. compilatorul spune. asta. dacă nu se specifică altfel. tabel. care caută metoda. Acesta este determinat de tipul unui obiect de referință. Pentru a indica în mod clar necesitatea de a găsi metoda potrivită pentru tipul de obiect. mai degrabă decât link-uri. specifiers utilizate virtuale și abstract, iar metodele indicate sunt numite virtuale și abstracte, respectiv.
Metodă virtuală - o metodă. care este declarată în clasa de bază folosind cuvântul cheie virtuale și apoi suprascrisă într-o clasă derivată cu suprareglării cuvântului cheie. În același timp. dacă puse în aplicare moștenire. inclusiv mai multe niveluri. fiecare clasă derivată poate avea propria sa versiune a metodei virtuale.
Modificarea metodei Show din clasele PointPlane PointSpace și luând în considerare ceea ce a fost spus.
public void Arată virtual () // în clasa PointPlane
Console.WriteLine ( "(,)", x, y);
supracontrol publică Afișare void () // în clasa PointSpace
Console.WriteLine ( "(,,)", x, y, z);
Acum, ia în considerare următorul fragment de cod.
PointPlane [] array = new PointPlane [6]; array [0] = new PointPlane ();
array [1] = new PointPlane (1);
array [2] = new PointPlane (2, 3); array [3] = new PointSpace (); array [4] = new PointSpace (4); array [5] = new PointSpace (5, 6, 7); foreach (poziția PointPlane în matrice)
Rezultatul fragmentului de program.
(0, 0, 0) (4, 4, 4) (5, 6, 7)
Astfel. prin polimorfism. printr-o variabilă de referință a clasei de bază se poate referi la obiecte de diferite tipuri. precum și utilizând același nume pentru a efectua diferite acțiuni.
Adăugați metoda virtuală clasa de baza PointPlane Distanța, permițând pentru a calcula distanța de la origine la un punct specificat. Redefinească într-o clasă derivată PointSpace în considerare. că punctul stabilit în spațiu. Să demonstreze funcționarea acestei metode.
Metode abstracte și clasele
Uneori este util pentru a crea o clasă de bază. este determinată doar de un fel de „formă goală“, care va moșteni toate clasele derivate. fiecare dintre ele va umple „forma“ propriile informații. Această clasă definește structura metodelor. care a derivat de clase trebuie să pună în aplicare. dar clasa în sine nu oferă punerea în aplicare a acestor metode. O astfel de situație poate să apară atunci. în cazul în care clasa de baza nu este pur și simplu în măsură să pună în aplicare metoda. În această situație, a dezvoltat metode abstracte.
sau întregi clase abstracte.
O metodă abstractă este descrisă de abstract specificator. El nu are nici un corp și. Prin urmare. nu a realizat clasa de bază. și clasele derivate ar trebui să suprascrie necesar. O metodă abstractă este virtuală în mod automat și virtuale pentru a utiliza un calificativ nu este necesar. Mai mult decât atât. dacă încercați să utilizați atât specificatorul (abstract și virtual), în același timp. compilatorul generează un mesaj de eroare.
În cazul în care o clasă conține cel puțin o metodă abstractă. acesta trebuie să fie, de asemenea, declarate ca fiind abstracte. folosind Specificator abstract înainte de clasă. Ca o clasă abstractă nu este pe deplin pusă în aplicare. este imposibil de a crea o instanță a clasei cu ajutorul chirurgiei
noi. De exemplu. În cazul în care clasa Demo este definită ca fiind abstractă. încercarea de a crea o instanță a clasa Demo va cauza o eroare.
Demo un nou = Demo ();
Cu toate acestea, puteți crea o serie de referințe. tipul care corespunde unei clase abstracte.
Demo [] Ob = new Demo [5];
Dacă o clasă derivată moștenește abstract. el trebuie să suprascrie complet toate metodele abstracte din clasa de bază. sau, de asemenea, să fie declarate abstracte. Astfel. Specificator abstract este moștenită de până acum. în timp ce într-o clasă derivată, nu toate metodele abstracte vor fi puse în aplicare.
Luați în considerare exemplul utilizării metodelor abstracte și clase.
folosind System; Spațiu de nume myprogram
abstract Punctul public class // clasa abstracta
abstract public void Show (); Distanța dublă publică abstractă ();
PointPlane și PointSpace.
folosind System; Spațiu de nume myprogram
PointPlane public class: Punctul
int protejat x; protejat int y;
PointPlane publice (int a)