2017-05-01 4 views
-1

Lets sagen, dass ich zwei Klassen haben, die die gleiche Schnittstelle implementiert:Gibt es ein Muster zum Erweitern einer Basisklasse mit Kindern, die eine Schnittstelle implementiert?

public interface IDoSomething 
{ 
    void DoSomething(); 
} 

public class Child1 
{ 
    private const int CONST1 = 0; 

    void IDoSomething.DoSomehting() 
    { /*Do something the way a Child1 would*/ } 
} 

public class Child2 
{ 
    private const int CONST1 = 0; 

    void IDoSomething.DoSomehting() 
    { /*Do something the way a Child2 would*/ } 
} 

Was ich will, ist wissen, da beide Klasse verwendet die gleiche Konstante (CONST1) sollte ich eine neue Klasse so etwas wie zu erstellen:

public class Parent 
{ 
    private const int CONST1 = 0; 
} 

und dann Child1 und Child2 erben von dieser Klasse unter der Annahme, dass die realen Klassen in diesem Szenario größer ist (hat mehr als eine Konstante und mehr als eine Funktion über die Schnittstelle implementiert)?

+0

Sie können die Elternklasse als abstrakt deklarieren und dann die Konstante als geschützt markieren. Dann können Sie die Interface-Methode in der Elternklasse als abstrakt markieren und die untergeordnete Klasse dazu zwingen, sie zu implementieren. – willaien

+0

Sie müssen nicht von einer Klasse erben, um eine Konstante zu verwenden. Sie können auf eine Konstante von einer anderen, nicht verwandten Klasse zugreifen, solange sie öffentlich ist. – Servy

+0

@willaien Ihr Kommentar scheint viel Sinn zu machen – Sebastien

Antwort

1

Vererbung - NEIN.

Vererbung ist eine gute Wahl, wenn:

  • Ihre Vererbungshierarchie eine "ist-a" Beziehung darstellt und nicht eine "hat-eine" -Beziehung.
  • Sie können Code aus den Basisklassen wiederverwenden.
  • ...

Quelle - https://msdn.microsoft.com/en-us/library/27db6csx(v=vs.90).aspx

Bedingung # 1 sofort in Ihrem Fall nicht, weil Ihr Kind Klasse "hat-ein" konstant.

Bedingung # 2 könnte Sie an Parent denken lassen, aber denken Sie daran, dass # 1 immer noch die Priorität sein sollte, wenn Sie sich für die Vererbung entscheiden. Der Wiederverwendungscode in # 2 bezieht sich auf die Wiederverwendung des Verhaltens der Elternklasse und nicht nur der Felder.

Ich denke, die Kommentare auf Ihrem Beitrag haben Sie bereits auf einem richtigen Weg gebracht. Ich werde mich hier nur konsolidieren.

public interface IDoSomething { 
    void DoSomething(); 
} 

public class Constants { 
    private Constants() {} 
    public const int CONST1 = 0; 
} 

public class Class1 : IDoSomething { 
    public void DoSomething() { 
     Console.Write(Constants.CONST1); 
    } 
} 
+0

Aaaaaahhhh, war das, was Servy versucht hat, mich in dem Kommentar auf der Spitze herauszufinden? – Sebastien

+0

Ja! Das ist richtig. – niksofteng

Verwandte Themen