Подтвердить что ты не робот

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

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

namespace DSnA
{
    public abstract class Test : IComparable
    {

    }
}

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

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

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

4b9b3361

Ответ 1

В С# вы все еще определяете методы, но вы не предоставляете тело, и вы отмечаете его как абстрактный. Например:

interface IFoo
{
    void Bar();
}

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

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

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

Ответ 2

В отличие от Java, в С#: "абстрактный класс должен обеспечивать реализации всех членов интерфейсов, перечисленных в списке базового класса класса. Однако абстрактному классу разрешается сопоставлять методы интерфейса с абстрактными методами".

https://msdn.microsoft.com/en-us/library/Aa664595(v=VS.71).aspx

Ответ 3

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