2012-03-29 10 views
1

Ich wünsche mir, eine Schnittstelle könnte aus Methoden bestehen, die in mehreren Klassen erfüllt sind. Wenn ich das könnte, könnte ich eine Schnittstelle für eine Rolle erstellen, die eine Funktion von dieser Klasse und eine Funktion von dieser Klasse hat.Interface Split zwischen zwei Klassen

Unterstützt eine beliebige Sprache dies? Ist es möglich in der typischen Java/C#/VB.NET-Stil OO?

Zum Beispiel: Ich habe eine Funktion, die ein Wertobjekt übernimmt und alle Teile in den richtigen Tabellen speichert. Ich habe gerade eine Schnittstelle namens StatsPersistence erstellt, die ich in eine Funktion injiziere, damit ich ihr Verhalten testen kann, aber es fehlt eine Methode. Ich möchte in der Lage sein, eine Methode hinzuzufügen, aber diese Methode ist in einer anderen Klasse als die ersten beiden, also ist das natürlich nicht möglich. Also, ich habe 2 Methoden in einer Klasse und 1 sind in der anderen, aber sie beide sind für die "Rolle" von "StatsPersistence" benötigt. Auch diese Methoden werden alle drei für andere Rollen benötigt, nicht nur diese.

Was ich habe:

interface StatsPersistence 
    public saveSession(session) // fulfilled in much larger StatsActiveRecord 
    public saveAppUse(appUse) // fulfilled in much larger StatsActiveRecord 

Was ich will:

interface StatsPersistence 
    public saveSession(session) // fulfilled in much larger StatsActiveRecord 
    public saveAppUse(appUse) // fulfilled in much larger StatsActiveRecord 
    public updateUnit(name)  // fulfilled in much larger UnitActiveRecord 

ich konnte nur eine neue Klasse machen, die alle drei Methoden Wraps, und haben diese Klasse nur Anrufe an die machen zwei Implementierer, aber das scheint eine Menge von OOverkill zu sein.

Meine Gedanken Neigung zu: zu breit

  • Meine Schnittstelle Rolle ist
  • eine Klasse machen, dass diese drei Packungen, und haben es meine gewünschte Schnittstelle implementieren
+1

Fassadenmuster vielleicht? –

+0

"Schnittstelle ist Vertrag, den die Klasse erfüllen muss" UND NICHT "Klassen sind Verträge, auf die die Schnittstelle angewendet werden muss". – Dhananjay

+0

@Dhananjay Ich wusste das, ich hoffte nur, dass es vielleicht ein "unbekanntes Unbekanntes" gab, das außerhalb meines Verständnisses von Schnittstellen und Klassen lauerte und wie sie zusammengesetzt werden konnten. Vielleicht eine neue Verwendung von Merkmalen oder eine funktionale Programmiertechnik, die mir nicht bekannt ist. – Steve

Antwort

2

Angenommen, Sie haben Variable vom Typ StatsPersistence. Ein Schnittstellenvertrag zwingt jede Instanz von StatsPersistence, die drei Methoden zu verwenden. Daher kann ein StatsActiveRecord nicht als StatsPersistence und dasselbe für die UnitActiveRecord gespeichert werden. Dies bedeutet, dass keines der Objekte eine Instanz von StatsPersistence sein kann, da keines der Objekte den Schnittstellenvertrag erfüllt. Daher ist es unmöglich, eine Schnittstellenimplementierung zwischen Klassen aufzuteilen.

Es gibt ein paar Alternativen.

Wie Sie bereits erwähnt haben, könnten Sie eine Master-Klasse haben, die die Schnittstelle implementiert und die zwei separaten Klassen aufruft. Das könnte schwierig sein, da die beiden "Unterklassen" vom Master zusammengehalten werden.

Sie haben erwähnt, dass die Schnittstelle zu breit ist. Sie können die Schnittstelle gegebenenfalls aufteilen.

Die beste Lösung (im allgemeinen Fall) ist es, die Klassen zu kombinieren. Wenn zwei Klassen zusammenarbeiten müssen, um zu entscheiden, wer bestimmte Dinge tut, können sie auch eine Klasse sein.

Verwandte Themen