2014-07-25 5 views
5

Angenommen, ich habe die Schnittstelle ISomeInterface mit den Methoden foo und bar definiert.
Zum BeispielWie gehen Sie vor, wenn die Implementierung für eine Interface-Methode für einige Klassen gleich ist?

Nehmen wir an, ich habe die Klassen A und B, die für beide sinnvoll sind, die Schnittstelle zu implementieren. Es macht aber auch keinen Sinn, eine andere Implementierung für foo() zu haben.
Berücksichtigt man, dass das Ableiten von A von B oder B von A falsch/seltsam ist, gibt es eine Standardcodierungspraxis für dieses Design?
Ich nehme an, ich könnte einige Dienstprogramme Klasse erstellen foo() zu implementieren und es als Delegierter nennen, aber ich frage mich, ob diese ganze Struktur unterschiedlich behandelt werden können

Update:
Um ein volles Verständnis für meine Frage zu geben ich stolperte über diese: http://perlbuzz.com/2010/07/why-roles-in-perl-are-awesome.html und ich habe versucht zu verstehen, wenn diese Funktion von den traditionellen OO-Konzepten fehlt, wie wir sie in Java verwenden oder nicht

+2

Warum machen Sie nicht Ihre Schnittstelle zu einer abstrakten Klasse und bieten eine Implementation für foo()? – Seb

+0

Wenn Sie in Java8 sind, könnten Sie eine [Standardimplementierung in der Schnittstelle] (http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html) bereitstellen oder Sie könnten immer dem agilen Manifest folgen und entscheiden Sie sich für eine Has-A-Beziehung, indem Sie einen Mitarbeiter erstellen, der die Funktionalität ausführen kann. Das A und B würden eine Is-A-Beziehung mit der Schnittstelle und eine Has-A-Beziehung mit dem Kollaborateur haben. –

+0

@Dan Temple: Siehe Update – Jim

Antwort

1

Beschlossen zu meinem Kommentar zu einer Antwort drehen:

Man könnte eine abstrakte Klasse, anstatt eine Schnittstelle verwenden:

public abstract class FooBar { 
     public void foo(){ 
     //your implementation goes here 
     } 

     abstract void bar(); 
    } 

    public class A extends FooBar{ 

     @Override 
     public void bar(){ 

     } 
    } 
1

Warum nicht so etwas wie dieses:

public class abstract SomeAbstractClass { 
    public void foo(){ 
     //implementation 
    } 
    public abstract void bar(); 
} 

class A extends SomeAbstractClass { 

} 

class B extends SomeAbstractClass { 

} 
1
public abstract class SomeClass implements ISomeInterface { 
    public void foo() { 
     // I do stuff.. 
    } 
} 

public class A extends SomeClass { 
    public void bar() { 
     // A specific impl. of bar.. 
    } 
} 

public class B extends SomeClass { 
    public void bar() { 
     // B specific impl. of bar.. 
    } 
} 
1

Alternativ, wenn Sie wollen A und B werden nicht gebunden Indem Sie eine abstrakte Klasse erweitern, können Sie einfach Komposition verwenden. Dies bietet auch die Flexibilität, das Verhalten IFoo zur Laufzeit zu ändern, wenn Sie die FooImpl als Teil des Konstruktors injizieren. In diesem Beispiel habe ich die FooImpl der Kürze halber fest verdrahtet.

+0

Siehe das Update in OP – Jim

+0

Sie würden zusätzliche Schnittstellen implementieren und Hilfsklassen ähnlich wie "IFoo + FooImpl" (siehe oben) bereitstellen, die die Implementierung für enthalten würden das erforderliche Verhalten – Brad

+0

Bedeutet dies, dass diese Funktion benötigt wird und fehlt? Weil ich von Ihrem Vorschlag eine ganz neue Hierarchie von Hilfsklassen schreiben müsste – Jim

4

Ihre Bearbeitung schlägt vor, dass Ihre wahre Frage lautet: "Gibt es eine Entsprechung für Perl-Rollen in Java?"

Seit Java 8 eingeführt default Methoden in Schnittstellen, Schnittstellen mit Standardmethoden scheinen wie ein sehr gutes Äquivalent für Rollen. Vor allem können Sie tun, was Sie in Ihrem Beispiel wollen: eine Standardimplementierung für foo() bereitstellen:

interface ISomeInterface { 
    public default void foo(){ /* your default impl goes here */} 
    public void bar(); // Abstract, must be implemented by subclasses 
} 

class A implements ISomeInterface { 
    // must only implement bar, can reuse foo's default impl 
} 

class B implements ISomeInterface { 
    // must only implement bar, can reuse foo's default impl 
} 

Wenn es eine Funktion, über Rollen ist mir fehlt lass es mich wissen. Ansonsten denke ich, Java8-Schnittstellen sind ein ziemlich guter Ersatz für Rollen.

+0

Sie haben Recht. Mein Hauptanliegen ist, dass ich ehrlich gesagt keine Notwendigkeit für "Rollen" sehe. Also ich frage mich, ob dies ein Fehler von OO ist, wie wir es in Java verwenden – Jim

+0

@Jim: Um ehrlich zu sein, Rollen scheinen mir wie normale Merkmale (d. H. Schnittstellen mit der Implementierung) zu mir. Die Autoren, die Rollen als etwas völlig Anderes vertreten, versuchen nur, ihnen ein anderes "Aussehen und Gefühl" zu geben, aber in ihrem Kern sehe ich keinen großen Unterschied zur üblichen Mehrfachvererbung ... – gexicide

Verwandte Themen