C#: Абстрактные классы должны реализовать интерфейсы?

Мой тестовый код в C#:

namespace DSnA
{
    public abstract class Test : IComparable
    {

    }
}

Результаты в следующей ошибке компилятора:

error CS0535: 'DSnA.Test' does not implement interface member
'System.IComparable.CompareTo(object)'

Начиная с класса Test абстрактный класс, почему компилятор требует, чтобы это реализовало интерфейс? Это требование должно не только быть обязательным для реальных классов?

123
задан bguiz 8 November 2013 в 06:36
поделиться

2 ответа

В C # класс, реализующий интерфейс, требуется для определения все члены этого интерфейса. В случае абстрактного класса вы просто определяете эти члены с помощью ключевого слова abstract :

interface IFoo
{
    void Bar();
}

abstract class Foo : IFoo
{
    public abstract void Bar();
}

Или, другими словами: вы не должны " реализовать " это (что было бы ужасным ограничением для абстрактных классов); однако в C # вы действительно должны сообщить компилятору , что вы намеренно перекладываете ответственность на конкретные подклассы - и в приведенной выше строке кода показано, как это сделать.

Комментарии и голоса против, жалующиеся, что это не ответ на вопрос, упускают из виду. Кто-то, кто приходит в Stack Overflow, получив эту ошибку компилятора, но имея абстрактный класс, в котором было бы ошибкой предоставлять реализацию, застрял без хорошего решения - должен был бы написать методы реализации, которые выдавали исключения времени выполнения, ужасная работа вокруг - пока они не получат вышеуказанную информацию. Хорошо или плохо, что C # требует такой явности, выходит за рамки Stack Overflow и не имеет отношения ни к вопросу, ни к этому ответу.

131
ответ дан 24 November 2019 в 01:18
поделиться

Им не обязательно реализовывать интерфейс .
Интерфейсные методы / свойства могут быть абстрактными или даже виртуальными. Так что подклассы должны их реализовать.

5
ответ дан 24 November 2019 в 01:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: