Member 11072126 Ответов: 2

Интерфейс над чисто абстрактным классом


Всем Привет,

Я разработчик C#, но меня смущает, почему мы не можем использовать чистый абстрактный класс вместо интерфейса.

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

Что я уже пробовал:

Я создал абстрактный класс и интерфейс только с одним методом. Затем я создал два класса, один из которых наследует абстрактный класс, а другой реализует интерфейс.

2 Ответов

Рейтинг:
1

OriginalGriff

В C# класс может быть производным только от одного базового класса, который может быть абстрактным или конкретным. Если ни один из них не указан, то класс является производным непосредственно от Object MS рассудила, что добавление множественного наследования добавляет слишком много сложности в C#, обеспечивая при этом слишком мало пользы.
Это дает нам проблему, которая решается с помощью интерфейсов - класс также может реализовать столько интерфейсов, сколько он хочет (используя тот же синтаксис, что и Деривация).
Существует некоторое "размытие" между абстрактными классами и интерфейсами в последней версии C#, теперь, когда интерфейсы могут предоставлять реализации методов по умолчанию, но это все еще не совсем то же самое, что "полная Деривация", которая все еще возможна только с одним классом.

Цитата:
Да. И я это знал. Учтите, у меня есть только один интерфейс с несколькими методами. В этом случае я всегда могу создать чистый абстрактный класс и выполнить свою работу. Не так ли?
Тогда должна быть и какая-то другая причина, почему нужно использовать интерфейс, а не чистый абстрактный класс или наоборот.
Это может быть связано со сборками, реализацией или безопасностью чего угодно.
На самом деле я думаю со всех сторон.
Пожалуйста, дайте мне знать, если вы также можете узнать некоторые другие моменты.
Большое спасибо.


Других пунктов нет - речь идет исключительно о единичном наследовании.
Подумайте об этом: у вас есть класс, который должен наследовать от SqlDataReader например. Это означает, что определение класса должно быть:
public MyClass : SqlDataReader
   {
   ...
   }

Предположим, вы также хотите, чтобы этот класс можно было использовать в foreach циклы: это означает, что он должен реализовать IEnumerator интерфейс* Поскольку C# не допускает множественного наследования,без интерфейсов вам пришлось бы выбирать между производными от SqlDataReader и IEnumerator Но, поскольку вы можете реализовать столько интерфейсов, сколько захотите, вы можете получить свой торт и съесть его:
public MyClass : SqlDataReader, IEnumerator
   {
   ...
   }
Не имея дополнительной сложности (а ее очень много), которая требуется для множественного наследования.


* Чрезмерное упрощение, я знаю - просто идите с ним.


Member 11072126

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

OriginalGriff

Вот почему существуют интерфейсы - потому что C# не допускает множественного наследования.
Функция интерфейсов "методы по умолчанию" является новой и предназначена для расширения интерфейса без нарушения существующего кода, а не для замены абстрактных классов.

Member 11072126

Да. И я это знал. Учтите, у меня есть только один интерфейс с несколькими методами. В этом случае я всегда могу создать чистый абстрактный класс и выполнить свою работу. Не так ли?
Тогда должна быть и какая-то другая причина, почему нужно использовать интерфейс, а не чистый абстрактный класс или наоборот.
Это может быть связано со сборками, реализацией или безопасностью чего угодно.
На самом деле я думаю со всех сторон.
Пожалуйста, дайте мне знать, если вы также можете узнать некоторые другие моменты.
Большое спасибо.

OriginalGriff

Ответ обновлен.

Maciej Los

И тоже проголосовали!
:смеяться:

Рейтинг:
1

CPallini

Вы вполне можете использовать абстрактный класс вместо интерфейса. Никто не мешает вам сделать это, и, возможно, не будет никакого вреда для нашего прекрасного мира.
Однако, как уже объяснил Грифф, в C# у вас не может быть двух базовых классов, поэтому, если ваш clss должен обеспечивать, скажем, два разных поведения, то он либо

  • наследуется от абстрактного класса и влияет на интерфейс
или
  • реализует два интерфейса

Соображения симметрии могут заставить вас выбрать второй вариант.

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


Maciej Los

5ed!

CPallini

Ты слишком добр, Мацей, большое тебе спасибо!

Member 11072126

Спасибо @CPallini за ответ. Даже Грифф сказал то же самое.

CPallini

Добро пожаловать.