2016-08-08 103 views
0

Ich weiß, was ich tun möchte, klingt dumm, aber hören:Inject Funktionalität in zwei Klassen ohne gemeinsame Superklasse

Ich habe abstrakte Klassen Entity und Player (erweitert Entity) und nicht abstrakte Klassen TestPlayer (erweitert Player) und TestMob (erweitert Entity).

Jetzt bin vor ich folgendes Problem:

ich in TestPlayer und TestMob einige abstrakte Methoden in Entity mit der gleichen Funktionalität implementieren möchten. Theoretisch könnte ich einfach eine andere Klasse erstellen TestEntity (Verlängerung Entity) und machen TestPlayer und TestMob erben von ihm. Aber dann TestPlayer konnte nicht mehr von Player erben. Die Implementierung der Funktionalität direkt in Entity ist keine Option, da nicht für alle Unterklassen diese Funktionalität vorgesehen ist.

Was könnte eine andere akzeptable Lösung sein, als doppelten Code?

+0

Was Sie wollen, ist buchstäblich eine Schnittstelle .. http://stackoverflow.com/documentation/java/102/interfaces/706/usefulness-of-interfaces#t=201608081851450672638 – Javant

+0

Natürlich I dachte daran. Das Problem hierbei ist, dass 'Player' nicht nur neue Methoden hinzufügt, sondern auch implementiert. – Androbin

+1

Oh okay .. Wenn ich es diesmal richtig lese, würde ich das Strategie-Muster verwenden. @Androbin http://www.tutorialspoint.com/design_pattern/strategy_pattern.htm – Javant

Antwort

1

Sie können auch das Dekorationsmuster (https://en.wikipedia.org/wiki/Decorator_pattern) verwenden. Sie haben eine Schnittstelle Entity und zwei Klassen, die es implementieren: und Decorator, wobei ConcreteEntity die Standardlogik hat und Decorator einen Verweis auf Entity hat und alle Methodenaufrufe delegiert. Dann können Sie Decorator erweitern. Statt new TestPlayer() haben Sie new Player(new TestEntity(new ConcreteEntity)))

1

Nicht sicher, ob es gute Praxis ist, aber was ist, wenn TestPlayer und TestMob beide einen Verweis auf TestEntity halten, anstatt von ihm erben und innerhalb jeder der jeweiligen Methoden aufrufen, die entsprechende Methode in TestEntity. #CompositionOverInheritance