2016-07-06 1 views
1

У меня есть класс, который является абстрактным с именем MyAbstractClass.частичная реализация абстрактного метода абстрактного класса

У меня есть 5 различных классов, которые расширяют его: классы A, B, E ..

Мне нужно добавить метод Foo() в классе MyAbstractClass но только А, В и C должен реализовать его, тогда как D и E его никогда не потребуется. (поток программы туда не достанется)

Что было бы хорошей практикой в ​​Java для достижения такого поведения?

Должен ли я использовать интерфейс?

Должен ли я добавить еще один слой наследования, чтобы два отличались между ними и добавляли foo только в средний слой?

Спасибо за любой совет.

ответ

5

Я вижу три основных подхода здесь:

Класс ребенок не делает ничего, если метод вызывается

В этом случае, вы можете войти на вызов или предупреждение, что его называли, и просто ничего не делайте.

Класс ребенок никогда не должен выполнять метод

В этом случае, вы можете бросить UnsupportedOperationException.

D и Е принципиально отличается от [А, В и С]

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

сделать интерфейс для A, B, и C

Как было предложено юз и Эйко, вы можете сделать интерфейс для этого конкретного метода, который только A, B, C и реализации. Если вы работаете со ссылочными типами суперкласса, вы можете проверить, obj instanceof MyInterface, чтобы определить, должен ли этот метод запускаться.

Если вы используете Java 8+ и нет функциональной разницы между рассматриваемым методом A, B и C, вы можете определить метод default в интерфейсе, который могут использовать все классы реализации.

+3

Не существует подобного решения с использованием интерфейса, который реализует только A, B и C (например, «Интерфейс Fooable») независимо от абстрактного класса? – yuz

+1

Я бы добавил возможность переключения на интерфейсы, возможно, с реализацией по умолчанию (если Java 8 или новее, и это «без апатии»). – Eiko

1

Я вижу два подхода:

  • делают реализации по умолчанию foo в родительском классе, который ничего не делает (пустой) метод не делает его абстрактным. В этом случае вы переопределяете метод в классах потомков по мере необходимости.

  • создать интерфейс, который содержит foo и осуществить это в A, B и C. В этом случае вам нужно будет проверить, реализует ли объект интерфейс, имеющий ссылку на объект в переменной MyAbstractClass, прежде чем вы сможете фактически вызвать foo.

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

  • Нет связанных вопросов^_^