Зачем нужны интерфейсы, когда существуют абстрактные классы?
Один из интервьюеров задал мне следующий вопрос, и я не мог ответить:
Зачем нужны интерфейсы, если существуют абстрактные классы?
Какими бы ни были методы, которые мы пишем в интерфейсе, мы также можем писать в абстрактном классе. Тогда зачем нужны интерфейсы отдельно?
Кто-нибудь может рассказать, в чем причина?
Спасибо за помощь...
Ответы
Ответ 1
Существует несколько отличий,
- Абстрактные классы могут иметь только один родительский класс, тогда как класс может реализовывать несколько интерфейсов.
- Интерфейсы не могут содержать никакой реализации, абстрактные классы могут (они могут иметь абстрактные методы в дополнение к абстрактным методам).
Интерфейсы отлично подходят для "вида", который мы можем иметь для класса. Это представление может использоваться несколькими классами, реализующими интерфейс.
Например, DataTable реализует IListSource и ISerializable. Таким образом, в зависимости от контекста вы можете просмотреть его как источник списка для чтения его данных или как класс, экземпляры которого могут быть сериализованы. Когда вы это сделаете, вы сосредоточитесь на определенном представлении, которое может иметь экземпляр.
Ответ 2
Интерфейс представляет собой контракт, в то время как вы можете иметь несколько реализаций этого контракта в разных (абстрактных) классах.
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.");
}
}
Ответ 3
Вы абстрактный класс является частичной реализацией. Интерфейсы - это контракты, чтобы знать, что может сделать ваш абстрактный класс. Для его описания нужен интерфейс.
Ответ 4
Вы можете реализовать несколько интерфейсов, но наследовать только один абстрактный класс.
Интерфейс - это пустая оболочка, существуют только подписи (имя/params/return type) методов. Методы ничего не содержат. Интерфейс ничего не может сделать. Это просто шаблон
Абстрактные классы, в отличие от интерфейсов, являются классами. Есть более дорогие в использовании, потому что есть поиск, когда вы наследуете их.
Абстрактные классы очень похожи на интерфейсы, но у них есть что-то еще: вы можете определить поведение для них. Это больше о парне, который сказал: "Эти классы должны выглядеть так, и они получили это вместе, так что заполните пробелы!".
Цитируется e-satis отсюда (гораздо больше информации):
В чем разница между интерфейсом и абстрактным классом?
Ответ 5
Вы не можете наследовать несколько абстрактных классов, но вы можете реализовать несколько интерфейсов.