Ich verstehe die Frage nicht so hundert prozentig, aber ich versuche es nochmal. Und da Code mehr als tausend Worte sagt
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| public class A { public virtual void DoSomething(){MessageBox.Show("Class A Call"); }
public class B : A { public overide void DoSomething(){MessageBox.Show("Class B Call"); }
public class C: A { }
public class D: A { public overide void DoSomething(){MessageBox.Show("Class D Call"); } |
Zitat: |
wenn virtuell jetzt implementiert ist, und die dazugehörige override Methode wurde einmal ausgeführt, wird die virtuelle Methode für immer hinfällig? |
Da war ein kleiner Fehler bei mir drin:)
Also korrekt muss es so lauten:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| B b = new B(); A a = b;
a.DoSomething();
C c = new C(); A a = c;
a.Something(); D d = new D(); A a = d;
a.DoSomething(); |
Zitat: |
ok... abstract MUSS also leer sein, virtuell kann leer, aber auch implementiert sein? |
Nein. Virtuell muss Text beinhalten. Und wenn es leere Klammern sind. Eine Funktion mit Rückgabewert muss immer auch ein "return" besitzen. Wirklich leer dürfen nur "abstracts" sein. Virtuel macht eine Aussage darüber, wie vererbt wird. "Abstract" ist eine Vererbungsbedingung.
Stellen wir uns mal vor, du bist bei einer Testamentseröffnung, und der Notar erklärt, du erbst eine Million Euro, wenn du machst, dass Schweine fliegen. Das ist ein "abstract", weil du in der Welt erst implementieren musst, dass Schweine fliegen.
Uns jetzt Stellen wir uns mal vor, du gehst zu deinen Eltern und bittest darum, dein Erbe vorzuziehen, weil du dringend ein neues Auto brauchst. Dafür versprichtst du ihnen, dass sie es mitbenutzen dürfen. Hier gibt es aber mehrere Möglichkeiten:
* du nutzt das alte Auto deiner Eltern mit
* du kaufst ein neues Auto und ihr teilt es euch (override)
* du verzichtest auf das Erbe und kaufst ein neues Auto und verwerst ihnen die Nutzung (new)
Das wäre virtuel vererbt.