2013-05-29 3 views
15

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

Зачем нам нужны интерфейсы, когда существуют абстрактные классы?

Независимо от методов, которые мы пишем в интерфейсе, мы также можем написать в абстрактном классе. Тогда зачем нам интерфейсы раздельно?

Может кто-нибудь рассказать, в чем причина?

Заранее спасибо ...

+6

Наследование множественного наследства позволяет реализовать несколько интерфейсов, но может только наследовать один класс в C# –

+2

С точки зрения Java, абстрактные классы предназначены для иерархии наследования, интерфейсы для контракта на реализацию. – NINCOMPOOP

+1

Интерфейсы также неоценимы в сценариях впрыска и модуляции зависимостей. Абстрактные базовые классы все еще могут содержать логику и, как результат, не могут быть полностью изделены в сценариях тестирования. – mclark1129

ответ

15

Есть несколько отличий,

  • Абстрактные классы могут иметь только один родительский класс, в то время как класс может реализовывать несколько интерфейсов.
  • Интерфейсы не могут содержать никакой реализации, абстрактные классы могут (они могут иметь абстрактные методы в дополнение к абстрактным методам).

Интерфейсы прекрасно подходят для «вида», который мы можем иметь для класса. Это представление может использоваться несколькими классами, реализующими интерфейс. (DataTable) IListSource и ISerializable. Таким образом, в зависимости от контекста вы можете просмотреть его как источник списка для чтения его данных или как класс, экземпляры которого могут быть сериализованы. Когда вы это сделаете, вы сосредоточитесь на определенном представлении, которое может иметь экземпляр.

+0

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

+0

@ Даниэль, я согласен, я просто выделил одну из самых очевидных различий –

10

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

public interface IExample 
{ 
    void Do(); 
} 

public abstract class DoFirst : IExample 
{ 
    public void Do() 
    { 
     Console.WriteLine("Doing it the first way"); 
    } 
} 

public abstract class DoSecond : IExample 
{ 
    public void Do() 
    { 
     Console.WriteLine("Doing it the second way"); 
    } 
} 

public class DoFirstConcrete : DoFirst, IExample 
{ 
    public void DoSomethingElse() 
    { 
     Do(); 
     Console.WriteLine("Doing something else also with first."); 
    } 
} 

public class DoSecondConcrete : DoSecond, IExample 
{ 
    public void DoSomethingElse() 
    { 
     Do(); 
     Console.WriteLine("Doing something else also with second."); 
    } 
} 
8

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

3

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

Интерфейс - пустая оболочка, существуют только подписи (имя/params/return type) методов. Методы ничего не содержат. Интерфейс ничего не может сделать. Это всего лишь шаблон

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

Абстрактные классы очень похожи на интерфейсы, но у них есть что-то еще: вы можете определить поведение для них. Это больше о парне, который говорит: «Эти классы должны выглядеть так, и они получили это вместе, так что заполните пробелы!».

Цитируется е-удовлетворяться здесь (гораздо больше информации, тоже): What is the difference between an interface and abstract class?

0

Вы не можете наследовать от нескольких абстрактных классов, но вы можете реализовать несколько интерфейсов.

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