C #: абстрактные классы должны реализовывать интерфейсы? - PullRequest
122 голосов
/ 24 апреля 2010

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

namespace DSnA
{
    public abstract class Test : IComparable
    {

    }
}

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

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

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

Ответы [ 3 ]

126 голосов
/ 24 апреля 2010

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

interface IFoo
{
    void Bar();
}

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

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

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

10 голосов
/ 12 августа 2015

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

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

3 голосов
/ 24 апреля 2010

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

...