Внедрить функциональность в два класса без общего суперкласса

Я знаю, что то, что я хочу сделать, звучит глупо, но послушай:

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

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

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

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

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


person Androbin    schedule 08.08.2016    source источник
comment
То, что вам нужно, это буквально интерфейс. /102/интерфейсы/706/   -  person Javant    schedule 08.08.2016
comment
Конечно, я думал об этом. Проблема здесь в том, что Player не только добавляет, но и реализует новые методы.   -  person Androbin    schedule 08.08.2016
comment
О, хорошо .. Если я правильно прочитал это на этот раз, я бы использовал шаблон стратегии. @Androbin tutorialspoint.com/design_pattern/strategy_pattern.htm   -  person Javant    schedule 08.08.2016


Ответы (2)


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

person Feanor    schedule 22.08.2016

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

person Androbin    schedule 08.08.2016