Почему родительский и дочерний класс реализуют один и тот же интерфейс? - PullRequest
28 голосов
/ 14 апреля 2011

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

public interface SoapFacade extends iConfigurable{ }

public class SoapFacadeBase implements SoapFacade{
...
}

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

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

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

Ответы [ 4 ]

39 голосов
/ 14 апреля 2011

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

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

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

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

11 голосов
/ 14 апреля 2011

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

0 голосов
/ 15 апреля 2011

Это чепуха, не делай этого.

Особенно в публичном API, таком как коллекции Java. Это полная чушь.

0 голосов
/ 14 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...