virtuelle metoder

Tags:    c#

Hej allesammen :)

Er lidt træt, men håber jeg kan formulere mig.

Hvis jeg har en Person-klasse, og en Employee, som nedarver fra Person-klassen, så skriver min bog følgende:

Person me = new Employee(“Bradley”, “Jones”, 1983);

Det de så vil med virtuel (og override), er at bruge metoden displayFullName() fra Employee, og ikke Person (den findes i begge).. det virker fint osv, men jeg kan ikke forstå hvorfor de ikke bare skriver følgende:

Employee me = new Employee(“Bradley”, “Jones”, 1983);

Så må man da være ude over det problem?

Er det mig der er dum, eller er det forfatteren som ikke fortæller hele sandheden?

Håber I forstår.

Hilsen
Mark



Jeg kender ikke C#, men C++, jeg går ud fra at det i dette tilfælde er det samme.

Der kan være flere grunde til at bruge
Person me = new Employee(...
I stedet for
Employee me = new Employee(...

Det kan f.eks. være fordi dem der skal håndtere me ikke behøver at vide at det er en ansat eller en kunde.

Et firma kunne f.eks. have en liste over alle der er tilknyttet firmaet, kunder, ansatte, ejere, osv. I listen kan alle bare være "person", og alle tilknyttede bliver behandlet på samme måde. Når man udskriver alle fra listen kalder man blot Udskriv for hver "person", det objekt der så implementer hver type person ved så hvordan de skal udskrives, kunder kan have en gæld, ansatte får løn, osv.

Håber det giver mening.



Det lyder rimeligt :)



Vil naturligvis gerne have andre svar



Et andet eksempel, hvis programmet skal udskrive til et "display", kunne dette display være et Windows-vindue, et konsol-vindue eller et lcd-display.
Hvis man så lavede en base-class (det hedder vist interface i C#), kaldet Display, kunne man lave en class for hver af de tre typer display, der implementerer dette interface (arver fra Display class'en).

Så kunne man:

Display display;
if(MyDisplayType == WindowsDisplayType
display = new WindowsDisplay;
else if(MyDisplayType == ConsolDisplayType
display = new ConsoleDisplay;
else if(MyDisplayType == LcdDisplayType
display = new LcdDisplay;

display.ShowWarning("I'm borred");

Ideen er at man så bruger display, uden at bekymre sig om hvilken type display der er tale om.



Tjo, men det samme kunne man vel også med

WindowsDisplay display = new WindowsDisplay(...

Da den har samme egenskaber som base-class'en (som det hedder i C# ifølge min bog :)), kan man vel stadig bruge den som denne.

Måske kræver det et helt konkret programmeringseksempel (altså som jeg selv sidder med), før jeg forstår hvad man kan bruge det til...



Okay, jeg har et nyt spørgsmål


Person me = new Employee("Bradley", "Jones", 1983);

me.displayFullName(); // bruger Employees funktion, ikke base-klassens

Console.WriteLine("me er en {0}", me.GetType()); // returnerer Employee

// TestF er defineret i Employee

(me as Employee).TestF(); // virker


me.TestF(); // virker ikke


Hvordan kan det være at hvis me er en Employee, hvorfor kan jeg så ikke tilgå dens funktioner direkte?



Indlæg senest redigeret d. 26.10.2007 20:43 af Bruger #2973
Jeg ved ikke rigtigt hvordan C# virker, men jeg tvivler på at man kan lave:

Fold kodeboks ind/udKode 

(Det kan man ikke i C++)

Du kan ikke kalde me.TestF() direkte fordi compileren ikke ved at me er en employee, du kan kun tilgå de funktioner der findes på Person, fordi me er en Person.

Eller, det er sådan det virker i C++, det er muligt at compileren i C# godt ved at det er en Employee, men kun lader dig behandle Me som en Person.

Det er normalt tegn på dårligt design hvis brugeren af me skal vide hvilken type det egentlig er.



t