Laden...

Überschreiben obwohl in der Basisklasse nicht erlaubt?

Erstellt von till_hm vor 18 Jahren Letzter Beitrag vor 18 Jahren 2.079 Views
T
till_hm Themenstarter:in
38 Beiträge seit 2006
vor 18 Jahren
Überschreiben obwohl in der Basisklasse nicht erlaubt?

Hallo,

ich möchte fragen, ob es möglich ist eine Methode bzw. Property zu überschreiben, obwhol sie in der Basisklasse nicht mit override deklariert wurde.

Till

59 Beiträge seit 2005
vor 18 Jahren

Guten Abend!

Stichwort "new-Modifizierer" in der SDK-Dokumentation.

HoGi

2b | !2b = 0xff

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo till_hm,

überscheiben im OOP Sinne kannst du sie dann leider nicht. new ist kein vollwertiger Ersatz.

herbivore

T
till_hm Themenstarter:in
38 Beiträge seit 2006
vor 18 Jahren

Schade, aber dann muss es halt anders gehen.

I
1.739 Beiträge seit 2005
vor 18 Jahren

Herbivore hat völlig recht mit der Aussage, das new kein vollwertiger Ersatz ist. Jedoch erscheint der Vorschlag von HoGi(Verwendung von new) die einzige Möglichkeit zu sein, wenn die Basis tabu ist(ist sie das?).

1.271 Beiträge seit 2005
vor 18 Jahren

Wenn ich mich recht entsinne, ist das Problem dabei, dass du dann "auf eine Implementierung" und nicht "auf eine Schnittstelle" programmieren musst. Du kannst also nicht so machen:

BaseClass instance=new DerivedClass();
instance.NotOveridableMethod();

Dabei wird dann nämlich die Original-Implementierung aufgerufen. Du musst also so machen:

DerivedClass instance=new DerivedClass();
instance.NotOveridableMethod();

Das bringt aber die Polymorphie gewaltig durcheinander.

(Falls das nicht stimmt, bitte drauf hinweisen!)

A wise man can learn more from a foolish question than a fool can learn from a wise answer!
Bruce Lee

Populanten von Domizilen mit fragiler, transparenter Außenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
Wer im Glashaus sitzt, sollte nicht mit Steinen werfen.

59 Beiträge seit 2005
vor 18 Jahren

Hallo progger,

das ganze ist eher so gedacht:


public class BaseC 
{
    public int x;
    public void Invoke() {}
}
public class DerivedC : BaseC
{
    new public void Invoke() {
        
        /* Edit */
        base.Invoke();
    }
}

Das Beispiel ist aus der SDK-Dokumentation (Edit) und ein wenig erweitert.

HoGi

2b | !2b = 0xff

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo progger,

du liegt richtig.

Hallo HoGi,

dein Beispiel verstehe ich nicht. Es zeigt ja nur, wie man new verwendet. Das Problem ist ja, dass es nicht so wirkt wie override und das hat progger in sein Beispiel deutlich gemacht.

Hallo zussammen,

bei override wäre in beiden Fällen korrekterweise DerivedClass.NotOveridableMethod aufgerufen worden (die dann natürlich besser OveridableMethod heißen würde).

Das Problem ist, dass bei new der statische Typ der Variable entscheidet, welche Methode aufgerufen wird. Das einzig korrekte ist aber, dass der dynamische Typ des Objekts entscheiden müsste.

herbivore

59 Beiträge seit 2005
vor 18 Jahren

Jetzt hat es "geklickt" worauf herbivore und progger hinaus wollten.
Ich muß zu meiner Schade gestehen, dass ich gar nicht soweit gedacht
hatte.

Tückisch ...

Gruß

HoGi

2b | !2b = 0xff