2012-03-28 3 views
0

ich eine abstrakte Methode in einer Basisklasse haben wie so erklärt ...Force One of Two Methode Implementationen in einem Kind Klasse

public abstract void StartHere(); 
public virtual void StartHere(string flag) 
{ 
    switch(flag) 
    { 
     default : StartHere(); break; 
    } 
} 

Gibt es eine Möglichkeit, es zu ändern, so dass das Kind erbt Klasse gezwungen wird, das eine oder das andere umzusetzen, aber nicht beides? Derzeit ist die Kindklasse gezwungen, nur StartHere() zu implementieren.

Würden Sie die bewährte virtuelle Methode auch auf die parameterlose Zusammenfassung zurückführen? oder ist das nur sinnlos?

Die Funktion dieser Methode besteht darin, die Klasse einzurichten, der Programmierer kann entweder eine einfache Einrichtung mit StartHere() oder eine kompliziertere unter einem Flag StartHere (String).

Vielen Dank!

+0

Sie geben dem Client-Programmierer zu viel Seil, um sich aufzuhängen. Programmieren Sie selbstbewusst, übernehmen Sie die Teile, auf die Sie achten sollten, und überlassen Sie es niemandem, es herauszufinden. Machen Sie StartHere (string) privat. –

Antwort

3

Im Allgemeinen wäre es sinnvoll, wenn die parameterlose Funktion die Para-metered-Funktion aufruft, indem die Standardwerte übergeben werden. Dies wird als Funktionskettenverkettung bezeichnet.

+0

Sie sagen also startHere() sollte startHere ("default") aufrufen ... aber dann kann es nicht abstrakt korrekt sein. Ich möchte, dass diese Methode abstrakt ist, um ihre Implementierung zu erzwingen. – user1229895

+0

Ja. Sie können den startHere mit der maximalen Anzahl der abstrakten Parameter beibehalten. Oder Methoden offenlegen, die die Attribute der Klasse setzen würden, die als Eingabeparameter dienen würde, und starten lassen. Diese Attribute/Eigenschaften verwenden. – Ramesh

+0

Ich bin mir immer noch nicht sicher, wie ich eine von zwei abstrakten Methoden erzwinge, aber ich habe die Reihenfolge umgekehrt ruft in einer anderen ähnlichen Methode von mir auf. Vielen Dank! – user1229895

1

würde ich ein anderes Design, so etwas wie lieber:

public void StartHere(); 
public virtual void StartHere(string flag) 
{ 
    StartHere(); 
} 

da in diesem Fall, die Elternklasse und die untergeordneten Klassen sind lose gekoppelt: die Elternklasse müssen wissen nichts . über die * Flagge * s, die in nur sind Klassen Kind interessiert

Wenn Sie Ihr aktuelles Design aus irgendeinem Grund zu folgen, schlage ich vor, Sie zumindest die folgenden Zeilen ändern:

switch(flag) 
    { 
     default : StartHere(); break; 
    } 

zu so etwas wie:

switch(flag) 
    { 
     "DEFAULTFLAG" : StartHere(); break; 
     default : throw ArgumentException(
      String.Format("Unrecognized flag '{0}'!", flag) 
      ); 
    } 

Es ist einfacher für Sie unbeabsichtigte Fehler zu fangen, wenn Sie versehentlich falsche Flags gesetzt.

+0

Danke für den Vorschlag, ich habe meinen Switch aktualisiert. Und könnte darüber nachdenken, alles zusammen zu entfernen. – user1229895

Verwandte Themen