Polymorfism
Polymorfa variabler class Person {} Tillåtet, eftersom alla Studenter och Lärare är Personer. class Teacher : Person {} class Student : Person {} … Person a = new Person(); Person b = new Student(); Person c = new Teacher(); Inte tillåtet, eftersom inte alla Personer är Studenter och Lärare. … Teacher x = new Person(); Student y = new Person();
Polymorfism och dynamisk bindning Fordon FordonsStannare Stanna () StannaFordon () Bil Stanna ()
Metodpolymorfism Det finns två slags ”metodpolymorfism”: Parameterpolymorfism (överbelastning) Även om operationen har samma namn, blir det en annan metod om vi har en annan argumentlista, dvs en annan signatur. Funktionspolymorfism (överskuggning) Om en operation i en subklass har samma signatur som en operation i dess basklass, kan subklassens metod överskugga superklassens metod.
Parameterpolymorfism class Person { string namn; int age; void ändra(int aa) { age = aa; } void ändra(string nn) { namn = nn; void ändra(string nn, int aa) {
Överskuggning (funktionspolymorfism) Ibland omdefinieras operationer Samma operation (med samma namn) finns då hos både subklassen och superklassen, men med olika metoder (annan kod som skall utföras) Kallas i programmeringen för ” överskuggning” Cykel märke modell beräknaLivslängdKvar() Växelcykel antalVäxlar beräknadrevlivslängd() beräknaLivslängdKvar() förändrad metod
Polymorfism Samma meddelande kan sändas till flera olika mottagare Olika mottagare exekverar varsin sekvens av instruktioner Att det finns flera beteenden, för det som betraktas som samma tjänst, kallas polymorfism :Vykort porto() :Paket porto() :Brev porto()
Funktionspolymorfism class Teacher : Person { public override void write() { // Annan kod } } class Person { public virtual void write() { // Kod } } class Student : Person { public override void write() { // Annan kod } }
Dynamisk bindning I ett objektorienterat program kan till namnet samma operation implementeras olika i olika specialiseringar En referens till en variabel ur en klass kan i själva verket referera till en specialisering Det fastställs inte vilken av de till namnet lika operationerna som skall anropas förrän programmet körs Detta innebär att det är lätt att förändra/utöka ett system Det är lätt att återanvända kod
Funktionspolymorfism class Person { public void write() { // Kod } } Men om vi inte har gjort superklassens metod ”virtual” då? Med ”new” talar vi om att vi vill dölja den ärvda metoden men… ... Person p = new Student(); Student s = new Student(); p.write(); s.write() class Student : Person { public new void write() { // Annan kod } } Kör write från Person-klassen. Kör write från Student-klassen.