Подтвердить что ты не робот

Почему оба родительского и дочернего классов реализуют один и тот же интерфейс?

Я унаследовал некоторый старый код Java (1.4), и это дизайнерское решение появляется регулярно. Я не могу понять, есть ли для этого какая-либо цель или причина.

public interface SoapFacade extends iConfigurable{ }

public class SoapFacadeBase implements SoapFacade{
...
}

public class SoapFacadeImpl extends SoapFacadeBase implements SoapFacade{
...
}

Как я понимаю интерфейсы (и мои эксперименты усилились), нет никакой цели, чтобы и родительский, и дочерний объекты реализовали один и тот же интерфейс. В этом случае все из SoapFacade реализовано в SoapFacadeBase, но метод в iConfigurable реализован в SoapFacadeImpl. Однако это не создает необходимость <<24 > реализовать SoapFacade.

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

4b9b3361

Ответ 1

Как я понимаю интерфейсы (и мои эксперименты усилились), нет никакой цели, чтобы как родительский, так и дочерний объекты реализовали один и тот же интерфейс.

Нет. Технически это полностью избыточно.

Однако он документирует тот факт, что вы намереваетесь SoapFacadeImpl быть SoapFacade, и это гарантирует, что вы получите ошибку компиляции, если вы (или кто-то другой) решите удалить implements SoapFacade из базового класса.

Вы видите этот шаблон повсюду в стандартном API коллекций Java. ArrayList реализует List, хотя его базовый класс (AbstractList) уже существует. То же самое выполняется для HashSet/AbstractSet и интерфейса Set.

Ответ 2

Если вы используете интерфейс также как маркер. Class.getInterfaces(); будет возвращать только интерфейсы с непосредственным интерфейсом.

Ответ 3

Я на самом деле считаю этот дизайн бессмысленным. Реализованные интерфейсы, как вы сказали, просто унаследованы, поэтому нет необходимости копировать и вставлять "реализует SomeInterface" в дочерние классы. Это не яснее, умнее или вообще...

Ответ 4

Это вздор, не делай этого.

Особенно в публичном API, таком как коллекции java. Это абсолютно абсурд.