2016-08-08 2 views
0

Я знаю, что я хочу сделать звучит глупо, но слушать:функциональность Inject на два класса без общего суперкласса

У меня есть абстрактные классы Entity и Player (распространяется Entity) и не абстрактные классы TestPlayer (распространяется Player) и TestMob (распространяется Entity).

Теперь я столкнулся со следующей проблемой:

Я хочу, чтобы реализовать некоторые абстрактные методы в Entity с той же функциональностью, внутри TestPlayer и TestMob. Теоретически я мог бы просто создать еще один класс TestEntity (расширение Entity) и сделать унаследованием TestPlayer и TestMob. Но вот TestPlayer не мог наследовать от Player.

Реализация функции непосредственно внутри Entity не является вариантом, поскольку она не предназначена для всех подклассов, имеющих эту функциональность.

Что можно считать приемлемым решением, кроме дублирующего кода?

+0

То, что вы хотите буквально интерфейс .. http://stackoverflow.com/documentation/java/102/interfaces/706/usefulness-of-interfaces#t=201608081851450672638 – Javant

+0

я, конечно, подумал об этом. Проблема здесь в том, что 'Player' не только добавляет, но и реализует новые методы. – Androbin

+1

О, ладно .. Если бы я правильно прочитал его на этот раз, я бы использовал шаблон стратегии. @ Андробин http://www.tutorialspoint.com/design_pattern/strategy_pattern.htm – Javant

ответ

1

Вы также можете использовать узор декоратора (https://en.wikipedia.org/wiki/Decorator_pattern). У вас есть интерфейс Entity и два его класса: ConcreteEntity и Decorator, где ConcreteEntity имеет логику по умолчанию, а Decorator имеет ссылку на Entity и делегирует все вызовы методов. Затем вы можете расширить Decorator. Вместо new TestPlayer(), у вас есть new Player(new TestEntity(new ConcreteEntity)))

1

Не уверен, что это хорошая практика, но что, если TestPlayer и TestMob и содержать ссылку на TestEntity вместо унаследованного от него, так и внутри каждого из соответствующих методов вызвать соответствующий метод внутри TestEntity. #CompositionOverInheritance

Смежные вопросы