2016-06-16 20 views
0

Ich habe 2 Klassen A und B, die beide die Eigenschaften X und Y haben; aber Klasse B hat auch eine andere Eigenschaft, Z. Klassen A und B sind völlig unabhängig von einander, sie teilen nur Eigenschaften X und Y.Entwurfsmuster: Vererbung oder Zusammensetzung

Inheritance

class A 
{ 
    public int X; 
    public int Y; 
} 

class B : A 
{ 
    public int Z; 
} 

Klasse B haben keine " ist-eine "Beziehung zu Klasse A, so bricht es Vererbungsprinzipale ist OOP.

Zusammensetzung

class A 
{ 
    public int X; 
    public int Y; 
} 

class B 
{ 
    public A ObjA; 
    public int Z; 
} 

Klasse B hat keine "hat-eine" Beziehung zur Klasse A, so dass es Zusammensetzung Prinzipien bricht, ist OOP.

Ohne doppelten Code, sollte ich Vererbung oder Zusammensetzung verwenden (obwohl sie die Prinzipien von OOP brechen) oder gibt es ein anderes Entwurfsmuster? Ich persönlich denke, dass die Verwendung der Vererbung wegen der Lesbarkeit das kleinere der Übel sein wird.

+0

* Wie würde ich das erreichen? *: Was erreichen? Ich kann nicht verstehen, was du verlangst. BTW, in Ihrem zweiten Beispiel, B ** hat ** eine hat-eine Beziehung mit A. –

+0

@ JBNizet Ich habe die Frage behoben, um es ein wenig klarer zu machen. Sag mir, wenn das hilft –

+0

Ehrlich gesagt, nein, tut es nicht. Wenn ich richtig verstehe, hat B keine has-a-Beziehung, daher sollte composition nicht verwendet werden, und es hat auch keine is-a-Assoziation mit A, daher sollte Vererbung nicht verwendet werden. Ist das richtig? Dann, nun, benutze keine von denen. Machen Sie B völlig unabhängig von A. Nur weil ein Auto Räder hat und eine Maus auch hat, bedeutet das nicht, dass sie verwandt sein sollten. Vielleicht könnten Sie, wenn Sie ein konkretes Beispiel mit echten Klassen geben, mehr Hilfe anbieten. –

Antwort

0
  1. Seit Klasse B hat keine "hat-a" -Beziehung zu Klasse A. so "Zusammensetzung" sollte nicht verwendet werden.

  2. Sie können die OOP-Vererbung so verwenden, wie Sie es entworfen haben. Es bricht die OOP-Prinzipien nicht, wie Sie gesagt haben. Klasse A & B sind nicht 100% unabhängig. Sie haben gemeinsame Eigenschaften, so dass OOP-Vererbung akzeptabel ist. Denken Sie daran, dass OOP Vererbung von Method-Mitgliedern nicht erfordert.

aber für Ihre case.You sollte Eigenschaften Erklärung duplizieren so Änderungen einer Klasse die andere nicht beeinflussen.

class A 
{ 
    public int X; 
    public int Y; 
} 

class B 
{ 
    public int X; 
    public int Y; 
    public int Z; 
} 
+1

Angesichts derjenigen, die die Frage kommentiert haben, glaube ich, dass Duplikation in diesem Szenario am besten ist. Vielen Dank –

0

Es ist schwer zu sagen, dass alles so abstrakt und schlecht definiert ist, aber im Allgemeinen sollten Sie Vererbung verwenden, wenn es sinnvoll ist, und nicht wenn es nicht sinnvoll ist und nicht wenn es sinnvoll ist. t.

Wenn A und B wirklich keine Beziehung haben, dann macht es wahrscheinlich mehr Sinn, Dinge anders zu strukturieren, mit dem Material, das Sie in seiner eigenen Klasse gemeinsam will, das mit A und B verwendet wird, oder geerbt:

class hasXY { 
    int X; 
    int Y; 
} 

class A : hasXY { } 
class B : hasXY { int Z } 

oder

class A { 
    hasXY XY; 
} 
class B { 
    hasXY XY; 
    int Z; 
} 

natürlich führt diese zusätzliche Overhead in einigen Sprachen (abhängig von ihren Implementierungsdetails)

0

Es hängt alles davon ab, was Sie unter „sie teilen nur Eigenschaften X und Y“.

Beide Eigenschaften sind öffentlich, daher tragen sie zum Verhalten der Klasse bei. Daher, wenn die Eigenschaften wirklich die gleichen sind (haben die gleiche Semantik), würde ich nicht sagen, dass die Klassen nicht verwandt sind.Sie teilen etwas Verhalten, also ist es sinnvoll, Vererbung oder bessere Zusammensetzung zu verwenden, was in den meisten Fällen vorzuziehen ist.

Aber da Sie davon ausgehen, dass A und B nicht verwandt sind, ist es wahrscheinlicher, dass die Eigenschaften nur nicht verwandte Variablen des gleichen Typs sind, denen Sie die gleichen Namen zugewiesen haben. Benennen Sie daher einfach die Eigenschaften in einer der Klassen um, und es wird deutlich, dass sowohl die Eigenschaften als auch die Klassen nicht verwandt sind.