2009-08-25 11 views
5

Mit so etwas wie dies folgendermaßen aus:Wie Implementieren einer Basisklasse mit einer Methode und dennoch erzwingen die abgeleitete Klasse es zu überschreiben?

public abstract class AAA 
{ 
    protected abstract virtual string ToString() // Error 
    { 
    // Base Stuff 
    } 
} 

public abstract class BBB : AAA 
{ 
    public override string ToString() 
    { 
    // Use base.ToString(); 
    // More Stuff 
    } 
} 

las ich einen anderen Posten (abstract method in a virtual class) Hexe war ziemlich wie meine Frage, aber es gibt einen kleinen Unterschied. Ich möchte, dass AAA.ToString() ein Basisverhalten hat und zwingen Sie die abgeleitete Klasse, es zu überschreiben.

Ich weiß, ich könnte so etwas tun (scroll down), aber ich war auf der Suche nach einem richtigen Weg.

public abstract class AAA 
{ 
    public abstract string ToString(); 
    protected string ToString2() 
    { 
    // Base Stuff 
    } 
} 

public class BBB : AAA 
{ 
    public override string ToString() 
    { 
    // Use base.ToString2(); 
    // More Stuff 
    } 
} 

Ich könnte auch wahrscheinlich eine IAAA Schnittstelle machen und meine BBB-Klasse bauen wie

public class BBB : AAA, IAAA { ... } 

aber sehen nicht richtig zu mir.

Antwort

5

Ihr Ansatz ist im Wesentlichen die richtige Art und Weise ...

Edit:

Ihre "Spezifikation" ist:

  1. Standardverhalten
  2. Erforderliche Überschreibung

Jetzt, seit Sie app Ohr wollen, dass die „Standardverhalten“ immer ausgeführt werden, müssen Sie

public string ToString() 
{ 
    // placeholder for some default behaviour 

    string result = doToString(); 

    // placeholder for some more default behaviour 

    return result; 
} 

protected abstract string doToString(); 

Dies funktioniert nur, wenn Sie wissen, was die Basisklasse ist im Allgemeinen zu tun, und die Implementierung für doToString() in der abgeleiteten Klasse zur Verfügung stellen möchten. Dies ist als Template Method Entwurfsmuster bekannt.

Wenn Sie jedoch für eine Art und Weise zu erfordern die implementierende Objekt einer abgeleiteten Klasse suchen base.ToString() bei der Umsetzung von ToString() zu nennen, dann gibt es keine Möglichkeit, dies zu tun. Indem Sie eine Überschreibung zulassen, geben Sie die abgeleitete Klassenkontrolle über ihre Implementierung.

Sie können Ihre Empfehlung dokumentieren, immer base.ToString() zu rufen, aber das ist es.

Die Verwendung einer Schnittstelle definiert den öffentlichen Vertrag für Ihre Klasse. Dies bietet Ihnen keinen zusätzlichen Vorteil gegenüber dem Template-Methodenmuster, da Sie immer noch von einer Basisklasse ableiten müssen, um die "Standard" -Implementierung zu erhalten.

Haben Sie Details zu dem, was Sie in Ihrer Basisklasse als Standardverhalten angeben möchten? Vielleicht hilft das zu einer besseren Lösung. Betrachtet man die referenzierte Frage, ist dies im Wesentlichen derselbe Ansatz.

+0

Danke, deine Bearbeitung mich wichtig, etwas realisieren gemacht! Selbst wenn ich eine wunderbare Möglichkeit finden würde, um ToString() in der Basisklasse zu definieren und die Überschreibung in der abgeleiteten Klasse zu erzwingen, gibt es einfach keine Möglichkeit, die Überschreibung zu zwingen, ToString() zu verwenden! Ich fand auch diesen Beitrag von einem MVP über zwangsweise Überschreibung: http://social.msdn.microsoft.com/forums/en-US/csharplanguage/thread/c25b6477-b990-4284-abaf-801ddf18207c. Danke nochmal Sir. – Tipx

+0

Froh, zu Diensten zu sein. Dieser Beitrag stammt von Marc Gravell ... er ist auch auf SO bekannt :) –

+0

Wie vergleicht sich das mit der Antwort der OPs? – Armbrat

0

Nein, es ist nicht möglich, eine derzeit virtuelle Funktion in eine abstrakte Funktion umzuwandeln. Die einzige Möglichkeit, dies zu erreichen, wäre, eine andere Funktion zu erstellen, die, wie Sie vorgeschlagen haben, abstrakt ist. Dies ist wohl ein geeigneterer Ansatz (und ich stimme dem zu).

2

Ich habe gerade herausgefunden, was genau das Verhalten zu bekommen, was ich tun wollte:

public abstract class AAA 
{ 
    protected abstract string ToStringSpecific(); 
    protected string ToString() 
    { 
    // Base Stuff 
    ... 
    // Use this.ToStringSpecific(); 
    } 
} 

public class BBB : AAA 
{ 
    protected override string ToStringSpecific() 
    { 
    // Specific Stuff 
    } 
} 
+0

Ich denke, Sie sollten Ihre ursprüngliche Frage bearbeitet haben ... – Armbrat

+0

Ich werde in der Tat die Frage bearbeiten (und den Titel), so könnte es jemand helfen, dieses Thema zu finden, aber ich werde meine Lösung hier lassen. (Wenn es nicht so gemacht werden sollte, gäbe es keinen Button "Anwsser Your Question") – Tipx

+0

Ich lese gerade den zweiten Teil meines Kommentars und es klingt "arrogant". Es tut mir leid, das wollte ich nicht, und ich kann den Kommentar nicht bearbeiten. Ich entschuldige mich. – Tipx

Verwandte Themen