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

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

namespace DSnA
{
    public abstract class Test : IComparable
    {

    }
}

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

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

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

Ответ 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

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