2009-03-09 7 views
2

Ich habe eine Oberklasse mit zwei Unterklassen. Die beiden Unterklassen haben beide eine Methode, mit der überprüft wird, ob ein Kapitel Inhalt hat. Für die Unterklasse 1 ist diese Methode HasContent (int chapterID) und für die Unterklasse 2 ist dies HasContent (int chapterID, int institution). Wie Sie sehen können, hat Unterklasse 2 einen zusätzlichen Parameter. Der Zweck beider Methoden ist der gleiche.C# Unterklasse mit der gleichen Methode

Ich dachte daran, die Methode HasContent in die Oberklasse zu setzen. Denkst du, ich muss das tun? Wenn ja, wie soll ich das umsetzen? Oder ist es sinnvoller, beide Methoden in ihre eigene Unterklasse zu stellen?

EDIT:

Der Körper HasDocuments wie folgt aussieht: Subclass1:

Database DB = new Database(); 
int res = DB.ExecuteSpRetVal(chapterID, mInstitutionID); 

if (res > 0) 
    return true; 
else 
    return false; 

Subclass2:

Database DB = new Database(); 
int res = DB.ExecuteSpRetVal(chapterID); 

if (res > 0) 
    return true; 
else 
    return false; 

Antwort

6

Bearbeiten: Aktualisiert nach der Frage aktualisieren.

Da Sie offenbar fast die gleiche Logik in beiden Verfahren, die sind, ich es so umgestalten würde:

abstract class SuperClass 
{ 
    protected bool HasContentImpl(int chapterID, int institution) 
    { 
     Database db = new Database(); 
     int result; 

     if (institution >= 0) // assuming negative numbers are out of range 
      result = db.ExecuteSpRetVal(chapterID, institution); 
     else 
      result = db.ExecuteSpRetVal(chapterID); 

     return result > 0; 
    } 
} 

class SubClass1 : SuperClass 
{ 
    public bool HasContent(int chapterID) 
    { 
     return base.HasContentImpl(chapterID, -1); 
    } 
} 

class SubClass2 : SuperClass 
{ 
    public bool HasContent(int chapterID, int institution) 
    { 
     return base.HasContentImpl(chapterID, institution); 
    } 
} 
+0

Also schlagen Sie vor, den Körper in die Unterklassen zu setzen? Und warum ist public bool HasContent (int chapterID, int institution) öffentlich? – Martijn

+0

Ja, tue ich, es sei denn, es ist etwas in der Implementierung üblich. Ich habe gerade deine Bearbeitung gesehen, also werde ich meine Antwort entsprechend aktualisieren. –

+0

Warum ist die HasContent-Überladung öffentlich? Weil ich annehme, dass du es von anderen Klassen anrufen willst! :) –

0

Sie sagte:

Der Zweck der beiden Methoden ist t er gleich

also ja, es klingt, dass Sie eine gemeinsame Methode haben, die Sie in die Oberklasse setzen können.

0

Als HasContent() unterschiedliche Augmentationen nimmt würde ich es nicht auf die Basisklasse nach oben, Die Tatsache, dass zwei Methoden gleich heißen, bedeutet nicht, dass sie dasselbe tun.

Ich weiß nicht, Ihre Code-Basis oder was das System, das Sie arbeiten, tut, aber angesichts der kleinen Informationen, die ich habe, etwas über Ihr Design fühlt sich wronge. Ich habe in der Vergangenheit festgestellt, dass, wenn ich diese Art von Designproblem habe, dies oft auf ein Problem zurückzuführen ist, bei dem es sich um ein Modell handelt. Tut mir leid, die Hilfe nicht zu finden, wenn Sie den Rest des Systems nicht ändern können ....

1

Verwenden Sie das Überladen von Methoden, indem Sie zwei gleichnamige Methoden mit unterschiedlichen Argumenten in die Oberklasse einfügen. Wenn Sie HasContent aufrufen, verwendet es den Wert, der mit der Anzahl und den Arten der von Ihnen angegebenen Argumente übereinstimmt. Da es sich in der Oberklasse befindet, müssen Sie jetzt keine weitere Kopie davon erstellen, wenn Sie später eine neue Unterklasse erstellen möchten, die diese Methode ebenfalls verwendet. Siehe unten für Beispielcode;

protected bool HasContent(int chapterID, int institution) 
{ 
    Database db = new Database(); 
    int result; 

    result = db.ExecuteSpRetVal(chapterID, institution); 

    return result > 0; 
} 

protected bool HasContent(int chapterID) 
{ 
    Database db = new Database(); 
    int result; 

    result = db.ExecuteSpRetVal(chapterID); 

    return result > 0; 
}