2010-04-24 3 views
108

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

namespace DSnA 
{ 
    public abstract class Test : IComparable 
    { 

    } 
} 

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

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

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

+0

Ха-ха. Я написал одно, а потом решил изменить его. Сожалею. :) – Joel

+0

Основываясь на понижающих прогнозах и комментариях к принятому ответу, я считаю, что downvotes приходят из-за того, как формулируется вопрос. OP спрашивает «почему это так», который будет находиться вне области stackoverflow. Встретившись с этим сам, вопрос больше напоминает «Я что-то упустил? Неужели мне действительно нужно поставлять реализации? Разве это не значит, что это абстрактный класс?» На что ответ «Нет, вам не нужно поставлять * реализации * (что нарушает цель абстрактного класса), но вот что вам нужно сделать, чтобы ваша ситуация работала». – ToolmakerSteve

ответ

96

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

interface IFoo 
{ 
    void Bar(); 
} 

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

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

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

+0

Я ищу аналогичный ответ, но в моем случае у меня есть 2 интерфейса (например, IFoo1 и IFoo2) с тем же именем метода, и у меня есть некоторые проблемы, обозначающие их как абстрактные в моем базовом (абстрактном) классе. Вы можете помочь? – Ben

+0

Не объясняет, почему абстрактному наследователю не нужно реализовывать базовые «абстрактные элементы». – AgentFire

+2

@Ben Просто увидел ваш комментарий. Вы, наверное, уже поняли это, но в случае, если кому-то это понадобится. Проверьте явные реализации интерфейса: http://msdn.microsoft.com/en-us/library/ms173157.aspx – Joel

3

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

7

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

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

+1

Супер чистый ответ и замечательный, что вы предоставляете обе ситуации, поскольку вы также могут иногда хотеть реализовать поведение в базовом классе. – VinKel

+0

. Возникают следующие вопросы: почему эти объявления шаблонов C# (которые, очевидно, они есть) должны существовать в абстрактных классах, которые в противном случае могли бы быть краткими и короткими (таким образом, испортить классы)? В моем проекте C# у меня много абстрактных классов и интерфейсов - и то, что я делаю в большинстве случаев, это копирование и вставка меток в Visual Studio. – forsberg

Смежные вопросы