Как реализовать функцию в два несвязанных класса

1

Мне был назначен проект, и моя работа - реализовать функцию уже существующей системы. Эта функциональность должна быть добавлена к двум отдельным классам. Оба этих класса расширяют один и тот же суперкласс, но нет смысла добавлять эту функцию в этот суперкласс. Каким образом я могу реализовать одну и ту же функциональность в этих двух отдельных классах без чрезмерного дублирования кода. Простым способом было бы реализовать эту функциональность в статическом классе, а затем использовать статические методы в двух классах, которые нуждаются в этой дополнительной функциональности, но это похоже на плохой дизайн.

Есть ли какой-либо дизайн, который я могу использовать для реализации чего-то подобного, или я сталкиваюсь с этой проблемой, просто демонстрируя большую проблему в иерархии, которая должна быть исправлена, а не пытаться работать поверх нее?

Теги:
oop

2 ответа

2

Java не имеет автономных "статических" классов, так что не стартер, поскольку это даже не возможно. Что касается использования статических методов, это прекрасно, если вы говорите о методах утилиты без учета состояния.

Я думаю, я бы решил это с композицией и интерфейсами:

  • Создайте интерфейс для желаемых функций
  • Создайте конкретные экземпляры этого интерфейса
  • Дайте поля двух классов интерфейса
  • Плюс методы getter и setter для интерфейса.
  • Если у классов должно было быть новое поведение, тогда им нужно реализовать интерфейс, а затем эти классы получить поведение путем "косвенности", вызвав методы содержащегося объекта в методах интерфейса.

Мне жаль, что этот ответ несколько расплывчатый и чрезмерно общий. Если вам нужны более конкретные советы от меня или от кого-либо еще здесь, подумайте о том, чтобы больше узнать о вашей проблеме.

1

Определите, какие общие черты этих двух классов используют новые функции. Затем извлеките эти функции в интерфейс, измените два класса для реализации этого интерфейса и поместите новый код функциональности в свой собственный класс (или, возможно, статический метод где-нибудь, например NewFeature.doTheThing(NewFeaturable toWhat)) и NewFeature.doTheThing(NewFeaturable toWhat) его работать эти интерфейсы.

Если существующим классам необходимо получить информацию из методов/вызовов, связанных с "новой функцией", дайте им поле NewFeature, являющееся экземпляром нового класса объектов, и чтобы они взаимодействовали с этим объектом. Псевдоэкс-код:

interface NewFeaturable {
    int getRelevantInfo ();
}

class NewFeature {
    final NewFeaturable object;
    NewFeature (NewFeaturable object) { this.object = object; }
    void doSomething () { int x = object.getRelevantInfo(); ... }
}

class ExistingClass extends Base implements NewFeaturable {
    final NewFeature feature;
    ExistingClass () { ...; feature = new NewFeature(this); }
    @Override int getRelevantInfo () { ... }
    void doSomethingNew () { feature.doSomething(); }
}

Будьте осторожны с new NewFeature(this) там, поскольку подклассы ExistingClass не будут полностью построены, когда они будут вызваны. Если это проблема, рассмотрите возможность отложить инициализацию feature до тех пор, пока она не понадобится.

Многие особенности зависят от вашей конкретной ситуации, но, надеюсь, вы получите общую идею.

  • 1
    Да, состав и интерфейсы. 1+

Ещё вопросы

Сообщество Overcoder
Наверх
Меню