2017-06-12 1 views
1

Dies ist das SzenarioGängige Praxis der Problemumgehung zu erweitern 2 Klassen in Java

interface BaseMsg 
interface SpecialMsg 

class FooBaseMsg implements BaseMsg 
class FooSpecialMsg extends FooBaseMsg implements SpecialMsg 

// The above classes are written by another team, and cannot be modified. 

class BarBaseMsg implements BaseMsg // totally different way to implement 
class BarSpecialMsg // this is the question 

Methoden zum SpecialMsg in FooSpecialMsg implementiert ist völlig gleich wie in BarSpecialMsg.

So ist es wirklich schlechte Praxis copy-paste die Implementierungen

Aber Methoden für BaseMsg unterscheidet.

Mein aktueller Ansatz ist

class BarSpecialMsg extends BarBaseMsg implements SpecialMsg 
    private FooSpecialMsg foo; 
    // constructors will have super(), and initialize FooSpecialMsg 
    // implements methods from SpecialMsg by calling 
    // foo.methods() 

Ist dies der richtige Weg, es zu tun? Was sind die Standards für diese Art von Problem?

Gibt es eine Art Designmuster, um dem entgegenzuwirken?

Die Abwärtsseite des aktuellen Ansatzes ist, dass die Daten dupliziert werden, da sie Ressourcen für 2 Objekte für jede Nutzung

+3

Je nachdem, wie man es betrachtet, haben Sie eine 'Decorator 'oder ein' Adapter'-Muster, das mit Composition implementiert wurde. Dieser Ansatz ist völlig in Ordnung. – KevinO

+0

Wenn Sie nicht erweitern können, dekorieren. Das ist also richtig, IMO. –

Antwort

1

Ist dies der richtige Weg, es zu tun verwendet? Was sind die Standards für diese Art Problem?

Gibt es eine Art Designmuster, um dem entgegenzuwirken?

Sie verwenden Zusammensetzung, um ein gemeinsames Verhalten zu teilen.
Es ist ein gültiger Ansatz.
In der Tat verwenden Sie bereits ein Design-Muster: der Adapter oder Wrapper.

BarSpecialMsg ist der Adapter Klasse und FooSpecialMsg ist die adaptierte Klasse.
Oder vom Wrapper-Muster Sicht BarSpecialMsg ist die Wrapper-Klasse und FooSpecialMsg ist die umschlossene Klasse.

Methoden zur SpecialMsg in FooSpecialMsg implementiert ist total die gleiche wie in BarSpecialMsg.

Aber Methoden für BaseMsg unterscheidet

Aber ich FooSpecialMsg zu BarSpecialMsg den Vorteil Paar nicht sehen.

Wenn die in FooSpecialMsg definierten Methoden, um die BaseMsg Schnittstelle implementieren nicht von BarSpecialMsg verwendet wird, sollte, denke ich, dass BarSpecialMsg mit FooSpecialMsg Komponieren fehleranfällig sein könnten. Außerdem erzeugt es eine Kopplung zwischen zwei Implementierungen, die wirklich nicht benötigt wird.

In diesem Fall scheint die Definition einer gemeinsamen Klasse, die SpecialMsg implementiert, besser zu sein.

public class CommonSpecialMsg implements SpecialMsg {...} 

Auf diese Weise Sie FooSpecialMsg und BarSpecialMsg mit einer Instanz von CommonSpecialMsg und delegieren Umsetzung SpecialMsg es zusammensetzen könnte:

class BarSpecialMsg extends BarBaseMsg implements SpecialMsg { 
    private CommonSpecialMsg composedSpecialMsg; 
... 
} 

class FooSpecialMsg extends BarBaseMsg implements SpecialMsg { 
    private CommonSpecialMsg composedSpecialMsg; 
... 
} 
+0

Vielen Dank für die Antwort. Dem stimme ich voll und ganz zu. Aber wie bereits erwähnt, wird "BarSpecialMsg" von einem anderen Team geschrieben, und sie sind sehr klar, dass ihr Code nicht berührt werden soll. Ich werde dieses Thema aufgreifen, wenn ich mich mit ihnen treffe. – william

+0

Arg, es wurde in einem Java-Kommentar geschrieben, ich habe es nicht gesehen ... In der Tat habe ich nie Kommentare gelesen ;-) Ich verstehe, dass der Code von einem anderen Team geschrieben wurde, aber in diesem Fall ist Ihre Lösung akzeptabel. Eine kleine Verbesserung wäre, in der Klasse "BarSpecialMsg" zu deklarieren: 'private SpecialMsg foo;' statt 'private FooSpecialMsg foo;' und einen Konstruktor mit derselben Logik zu versehen: 'public BarSpecialMsg (SpecialMsg specialMsg)'. Es würde mehr Abstraktion hinzufügen und eine schlechte Verwendung der spezifischen Implementierung verhindern: 'FooSpecialMsg'. – davidxxx

+0

Ja, ich habe die Abstraktion vergessen. Danke, dass du es aufgezeigt hast. – william

Verwandte Themen