2

Вопрос по design-patterns, java – Когда использовать расширяет, а когда использовать интерфейс?

Мы можем расширить класс, но мы не можем реализовать класс. Мы можем реализовать интерфейс, но не можем расширить интерфейс.

В каких случаях мы должны использовать удлинители?

<span>интерфейс может расширять интерфейс</span>

Oct 05, 2009, 8:12 AMотRich Seller

5ответов

0

Ключевое слово extends используется для расширения конкретного / абстрактного класса. Расширяя, вы можете либо переопределить методы родительского класса / наследовать их. Класс может только расширять класс. Вы также можете сказать, что interface1 расширяет inteface2.

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

5

extends используется либорасширение базового класса:

class ClassX extends ClassY {
    ...
}

или жерасширение интерфейса:

interface InterfaceA extends InterfaceB {
    ...
}

Обратите внимание, что интерфейсы не могутвоплощать в жизнь другие интерфейсы (скорее всего потому, что у них нет реализации).

Ява ненавязывать любые соглашения об именах классов и интерфейсов (в отличие отIFoo для интерфейсов в мире .NET) и вместо этого использует разницу междуextends а такжеimplements чтобы обозначить разницу для программиста:

class ClassA extends ClassB implements InterfaceC, InterfaceD {
    ...
}

Здесь вы можете ясно увидеть, что выперестраивать на существующей реализации вClassB а такжевоплощать в жизнь методы из двух интерфейсов.

3

На самом деле, вы можете расширить интерфейс - в случае, если выпереопределение другого интерфейса.

Есть много квази-религиозных аргументов по этому вопросу, и я сомневаюсь, чточеткий правильный ответ, но для чего этостоит здесьЭто мой взгляд на вещи. использованиеподклассов (Т.е.extends), когда ваши различные классы предоставляют одинаковую функциональность и имеют некоторые общие детали реализации. использованиереализация интерфейса, чтобы сигнализировать о том, что ваши классы предоставляют определенную функциональность (как указано в интерфейсе).

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

В Java нет множественного наследования, так что (под) класс может иметь только один родительский класс, и подклассы следует тщательно продумать, чтобы выбрать подходящего родителя, если он вообще существует; выбор родителя, который отражает лишь небольшое количество класса " способности могут закончиться разочарованием позже, если будут другие разумные родительские классы. Так, например, имеяAbstractSQLExecutor с SQL Server и Oracle подклассы имеет большой смысл; но иметь родительский класс FileUtils с некоторыми служебными методами, а затем наследовать его повсеместно для наследования этой функциональности - плохая идея (в этом случае вам, вероятно, следует объявить статические методы-помощники или содержать ссылку на Экземпляр FileUtils, вместо этого).

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

3

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

Возьмем, например, шаблон зависимости от инъекций:

Вы сначала пишете контракт:

     public interface IProductRepository
     {
        IList GetAllProducts();
     }

Затем вы продлеваете свой контракт с базовым классом:

     public abstract BaseProductRepository : IProductRepository
     {
         public IList GetAllProducts()
         { //Implementation }
     }

Теперь у вас есть возможность расширить базу на два или более конкретных классов:

     public class InternetProductRepository extends BaseProductRepository;
     public class StoreProductRepository extends BaseProductRepository;

Я надеюсь, что этот небольшой пример прояснит различия между extends и Implement. извините, что я не использовал java для примера, но все из-за OO, так что я думаю, вы поймете.

Спасибо за чтение, Гео


Я не закончил код для шаблона зависимости внедрения, но идея есть, также хорошо документирована в сети. Дайте знать, если у вас появятся вопросы.

0

Как ты говорил.implement Ключевое слово Java используется для реализации интерфейса, гдеextends используется для расширения класса.

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

Помните, что в Java вы можете расширить только один класс и реализовать ноль для многих интерфейсов для реализующего класса. В отличие от C #, где вы можете расширить несколько классов, используя:и где C # использует только: символ для интерфейсов и классов.

RelatedQuestions