Почему оба родительского и дочернего классов реализуют один и тот же интерфейс?
Я унаследовал некоторый старый код 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
.
Есть ли что-то, что я не знаю об интерфейсах, которые могли бы придать этому шаблону какую-то цель или выгоду? Существуют ли базовые издержки за пределами ясности, которые должны стимулировать реорганизацию? Или он просто должен быть реорганизован для ясности/простоты?
Ответы
Ответ 1
Как я понимаю интерфейсы (и мои эксперименты усилились), нет никакой цели, чтобы как родительский, так и дочерний объекты реализовали один и тот же интерфейс.
Нет. Технически это полностью избыточно.
Однако он документирует тот факт, что вы намереваетесь SoapFacadeImpl
быть SoapFacade
, и это гарантирует, что вы получите ошибку компиляции, если вы (или кто-то другой) решите удалить implements SoapFacade
из базового класса.
Вы видите этот шаблон повсюду в стандартном API коллекций Java. ArrayList
реализует List
, хотя его базовый класс (AbstractList
) уже существует. То же самое выполняется для HashSet
/AbstractSet
и интерфейса Set
.
Ответ 2
Если вы используете интерфейс также как маркер. Class.getInterfaces();
будет возвращать только интерфейсы с непосредственным интерфейсом.
Ответ 3
Я на самом деле считаю этот дизайн бессмысленным. Реализованные интерфейсы, как вы сказали, просто унаследованы, поэтому нет необходимости копировать и вставлять "реализует SomeInterface" в дочерние классы.
Это не яснее, умнее или вообще...
Ответ 4
Это вздор, не делай этого.
Особенно в публичном API, таком как коллекции java. Это абсолютно абсурд.