OriginalGriff
В C# класс может быть производным только от одного базового класса, который может быть абстрактным или конкретным. Если ни один из них не указан, то класс является производным непосредственно от Object
MS рассудила, что добавление множественного наследования добавляет слишком много сложности в C#, обеспечивая при этом слишком мало пользы.
Это дает нам проблему, которая решается с помощью интерфейсов - класс также может реализовать столько интерфейсов, сколько он хочет (используя тот же синтаксис, что и Деривация).
Существует некоторое "размытие" между абстрактными классами и интерфейсами в последней версии C#, теперь, когда интерфейсы могут предоставлять реализации методов по умолчанию, но это все еще не совсем то же самое, что "полная Деривация", которая все еще возможна только с одним классом.
Цитата:
Да. И я это знал. Учтите, у меня есть только один интерфейс с несколькими методами. В этом случае я всегда могу создать чистый абстрактный класс и выполнить свою работу. Не так ли?
Тогда должна быть и какая-то другая причина, почему нужно использовать интерфейс, а не чистый абстрактный класс или наоборот.
Это может быть связано со сборками, реализацией или безопасностью чего угодно.
На самом деле я думаю со всех сторон.
Пожалуйста, дайте мне знать, если вы также можете узнать некоторые другие моменты.
Большое спасибо.
Других пунктов нет - речь идет исключительно о единичном наследовании.
Подумайте об этом: у вас есть класс, который должен наследовать от
SqlDataReader
например. Это означает, что определение класса должно быть:
public MyClass : SqlDataReader
{
...
}
Предположим, вы также хотите, чтобы этот класс можно было использовать в
foreach
циклы: это означает, что он должен реализовать
IEnumerator
интерфейс
* Поскольку C# не допускает множественного наследования,без интерфейсов вам пришлось бы выбирать между производными от
SqlDataReader
и
IEnumerator
Но, поскольку вы можете реализовать столько интерфейсов, сколько захотите, вы можете получить свой торт и съесть его:
public MyClass : SqlDataReader, IEnumerator
{
...
}
Не имея дополнительной сложности (а ее очень много), которая требуется для множественного наследования.
* Чрезмерное упрощение, я знаю - просто идите с ним.
Member 11072126
Привет, спасибо за ваш ответ. Но я знаю о множественном наследовании, и я знаю, что интерфейс может решить эту проблему.
Я хотел знать все, кроме множественного наследования.
Member 11072126
Да. И я это знал. Учтите, у меня есть только один интерфейс с несколькими методами. В этом случае я всегда могу создать чистый абстрактный класс и выполнить свою работу. Не так ли?
Тогда должна быть и какая-то другая причина, почему нужно использовать интерфейс, а не чистый абстрактный класс или наоборот.
Это может быть связано со сборками, реализацией или безопасностью чего угодно.
На самом деле я думаю со всех сторон.
Пожалуйста, дайте мне знать, если вы также можете узнать некоторые другие моменты.
Большое спасибо.