2012-06-22 11 views
5

Ich habe durch die SO Artikel folgen lesenAbgeleitete Klasse aufrufen statische Methode der Basisklasse in einem eigenen statischen Methode

Alle scheinen ganz in der Nähe meine Frage und habe gute Antworten, aber sie scheinen meine Frage nicht zu beantworten, außer zu sagen, dass ich die Methode nicht-statisch machen muss.

ein Beispiel:

abstract public class baseClass 
{ 
    private static List<string> attributeNames = new List(new string {"property1","property2"}); 
    // code for property definition and access 
    virtual public static bool ValidAttribtue(string attributeName) 
    { 
     if (attributeNames.Contains(attributeName)) 
      return true; 
     else 
      return false; 
    } 
} 
class derivedA : baseClass 
{ 
    private static List<string> attributeNames = new List(new string {"property3","property4"}); 
    // code for property definition and access 
    public static override bool ValidAttribute(string attributeName) 
    { 
     if (attributeNames.Contains(attributeName)) 
     { 
      return true; 
     } 
     else 
     { 
      return base.ValidAttribute(attributeName); 
     } 
    } 
} 
class derivedB : baseClass 
{ 
    private static List<string> attributeNames = new List(new string {"property10","property11"}); 
    // code for property definition and access 
    public static override bool ValidAttribute(string attributeName) 
    { 
     if (attributeNames.Contains(attributeName)) 
     { 
      return true; 
     } 
     else 
     { 
      return base.ValidAttribute(attributeName); 
     } 
    } 
} 

derivedA würde Eigenschaften 1,2,3,4 während derivedB Eigenschaften 1,2,10,11 haben würde. Die Liste der Eigenschaften scheint ein klassenspezifischer Wert zu sein und kann an keiner Stelle geändert werden. Ich würde denken, dass es dann statisch wäre.

Ist mein Entwurf falsch in dem Sinne, dass ich versuche, statische Methoden zu verwenden, wenn sie nicht sein sollten?

Das obige Beispiel lässt mich denken, dass die Vererbung von statischen Methoden benötigt wird, aber es scheint, dass der Versuch, dies zu tun, ein Konstruktionsfehler ist. Kann mir jemand auf diese Weise helfen zu verstehen, was mit der Codierung oder Strukturierung von Klassen falsch ist?

+0

Ist das eigentliche Code? Sie können keine virtuellen statischen Mitglieder haben. –

+0

Nein, es ist nur ein Beispielcode einer Operation, von der ich dachte, dass sie möglich sein sollte. –

Antwort

8

Ist mein Entwurf falsch in dem Sinne, dass ich versuche, statische Methoden zu verwenden, wenn sie nicht sein sollten?

Ja. Abgesehen von allem anderen versuchen Sie, eine statische Methode als virtual zu deklarieren (und dann außer Kraft setzen), was nicht erlaubt ist. Sie versuchen auch, eine Klasse namens base zu deklarieren, wenn das ein Schlüsselwort ist.

Statische Methoden sind einfach nicht polymorph. Die Basis des Polymorphismus ist, dass der Ausführungszeittyp der betroffenen Instanz sich vom Kompilierungszeittyp des Ausdrucks unterscheiden kann, und die Implementierung wird auf der Grundlage des Ausführungszeittyps ausgewählt. Dieses Konzept ist für statische Methoden nicht sinnvoll, da keine Instanz ist.

Jetzt natürlich kann eine statische Methode in einer abgeleiteten Klasse eine statische Methode in der Basisklasse aufrufen - aber es wird nirgendwo Polymorphismus sein.

Als Randbemerkung, die alle Ihre Methoden in einem besser lesbaren Art und Weise geschrieben werden:

// Base class implementation 
return attributeNames.Contains(attributeName); 

// Derived class implementations 
return attributeNames.Contains(attributeName) || 
     BaseClass.ValidAttribute(attributeName); 
+0

Um sicherzustellen, dass ich das richtig verstehe, definiert die abstrakte Klasse die Operation, die alle abgeleiteten Klassen haben werden. Die abgeleiteten Klassen benötigen die vorhandene Funktionalität. Die Prüfung ändert sich nie und wird zur Kompilierzeit vollständig definiert. Das Vorhandensein oder Fehlen einer Eigenschaft ist zur Kompilierungszeit bekannt. Die Überprüfung muss sich pro Klasse ändern, sollte jedoch die Basisklassenfunktion nutzen können. Dieses Gebäude ist kein statischer Mechanismus, sondern ein Polymorphismus-Mechanismus. –

+0

@JohnGroman: Wenn Sie nicht brauchen * Polymorphismus - d.Rufen Sie die "richtige" Implementierung zur Ausführungszeit auf, basierend auf dem Typ einer Instanz - dann können Sie dies ohne Polymorphie tun. Ich würde Ihnen dringend raten, den Methoden verschiedene Namen zu geben, um deutlicher zu machen, dass tatsächlich kein Polymorphismus stattfindet, aber es wird funktionieren, im Sinne einer statischen Methode einer abgeleiteten Klasse, die die statische Methode einer Basisklasse aufruft. Es ist nur eine andere statische Methode, was die Sprache betrifft - es gibt keine Beziehung zwischen den beiden. –

+0

Danke für die Antworten und Kommentare Ich denke, ich muss mehr über Polymorphie lesen. Danke auch für die besser lesbare Form –

Verwandte Themen