2012-05-22 2 views
-1

В чем разница между следующим интерфейсом и абстрактным классом:Как принять решение между абстрактным и интерфейсом?

public interface MyInterface 
{ 
    public int get1(); 
    public int get2(); 
    public int get3(); 
} 

public abstract class MyAbstract 
{ 
public abstract int get1(); 
public abstract int get2(); 
public abstract int get3(); 
} 

Интервьюер не был уверен, со следующими ответы, он хотел услышать что-то еще:

  1. я должен продлить MyAbstract, и тогда я не могу имеют больше расширений, тогда как в случае реализации MyInterface я открыт для наследования.

  2. Я должен обеспечить реализацию всех трех методов, если используется «реализует MyInterface», тогда как в случае «extends MyAbstract» я открыт для переноса абстрактной абстрактности.

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

Что еще может быть? Меня не интересуют переменные в интерфейсе/абстрактном классе и т. Д. Как решить, какой из них использовать?

+0

Возможный дубликат [Когда использовать абстрактный класс или интерфейс?] (Http://stackoverflow.com/questions/1221512/when-to-use-abstract-class-or-interface) – mprabhat

+3

Ваша точка № 2 не имеет значения, t имеет смысл (как написано). Класс может быть объявлен как «реализует MyInterface», и если он также объявлен «абстрактным», ему не нужно реализовывать какие-либо методы. Очки 1 и 3 хороши - любой интервьюер, которому не нравятся эти причины, должен сам объяснять. –

+1

Почему это было приостановлено без объяснения причин в комментариях? Я думаю, что это правильный вопрос. – Axel

ответ

0

Нет смысла использовать класс abstract со всеми методами abstract - это по существу интерфейс. Если у вас есть общая базовая логика (реальный код, а не только абстрактные методы), тогда объявите класс abstract, возможно, используя interface.

3

Если связь между двумя классами очень определенно является отношением «is-a», может быть случай использования абстрактного класса.

Если у вас есть «поведение по умолчанию», общее для всех подклассов, то есть еще более сильный пример использования абстрактного базового класса.

Но в общем, если вы можете использовать интерфейс, то вы, вероятно, должны использовать интерфейс.

ИМХО ...

+0

Все больше и больше я использую Java/C# -style OO, я имею в виду, что абстрактные классы - это просто архаичные kludges, которые существуют, потому что не было лучшего способа совместного использования реализации. (Ладно, это не совсем так, но Я предпочитаю «интерфейсные контракты») –

+1

@pst - Абстрактные классы чрезвычайно полезны. Вы можете разделить общий код со связанными классами (не повторяйте себя), выражая [методы шаблона] (http://en.wikipedia.org/wiki/Template_method_pattern) и другие полезные вещи. Вы говорите, что это «не совсем верно», что они «архаичные клоды»; Я говорю, что это совсем не так. –

0

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

И вы всегда можете иметь интерфейс и его подклассы как абстрактный класс.

Используйте интерфейс на верхнем уровне. Переместите туда все методы, которые будут реализованы. Программа с интерфейсами не реализована. У реализации есть больше шансов, которые нужно изменить, меньше интерфейсов.

Смежные вопросы