Когда использовать расширяет, а когда использовать интерфейс? - PullRequest
2 голосов
/ 05 октября 2009

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

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

Ответы [ 5 ]

5 голосов
/ 05 октября 2009

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

class ClassX extends ClassY {
    ...
}

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

interface InterfaceA extends InterfaceB {
    ...
}

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

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

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

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

3 голосов
/ 05 октября 2009

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

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

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

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

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

3 голосов
/ 05 октября 2009

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

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

Сначала вы пишете контракт:

     public interface IProductRepository
     {
        IList<T> GetAllProducts();
     }

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

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

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

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

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

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


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

0 голосов
/ 05 октября 2009

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

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

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

0 голосов
/ 05 октября 2009

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

Для реализации интерфейса используется ключевое слово

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

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