Мой тестовый код в C #:
namespace DSnA
{
public abstract class Test : IComparable
{
}
}
Результатом является следующая ошибка компилятора:
error CS0535: 'DSnA.Test' does not implement interface member
'System.IComparable.CompareTo(object)'
Поскольку класс Test
является абстрактным классом , почему компилятор требует его реализации интерфейса? Разве это требование не должно быть обязательным только для конкретных классов?
c#
syntax
interface
abstract-class
bguiz
источник
источник
Ответы:
В C # класс, реализующий интерфейс, необходим для определения всех членов этого интерфейса. В случае абстрактного класса вы просто определяете эти члены с помощью
abstract
ключевого слова:Или, говоря иначе: вам не нужно «реализовывать» это (что было бы ужасным ограничением для абстрактных классов); тем не менее, в C # вы должны сообщить компилятору, что вы сознательно передаёте деньги конкретным подклассам - и приведенная выше строка кода показывает, как это сделать.
Комментарии и отзывы, жалующиеся на то, что это не ответ на вопрос, упускают суть. Кто-то, приходящий в Stack Overflow, получив эту ошибку компилятора, но имея абстрактный класс, в котором было бы ошибочно предоставлять реализацию, застрял без хорошего решения - ему пришлось бы писать методы реализации, которые вызывали исключения во время выполнения, - ужасная работа Вокруг - пока они не имеют вышеуказанную информацию. Хорошо это или плохо, что C # требует этой явности, выходит за рамки переполнения стека и не имеет отношения ни к вопросу, ни к этому ответу.
источник
Foo
на,public abstract void IFoo.Bar();
и вы получите жалобы на то, что «public» и «abstract» не являются допустимыми модификаторами.В отличие от Java, в C #: «абстрактный класс должен обеспечивать реализации всех членов интерфейсов, перечисленных в списке базовых классов этого класса. Однако абстрактному классу разрешено отображать методы интерфейса на абстрактные методы».
https://msdn.microsoft.com/en-us/library/Aa664595(v=VS.71).aspx
источник
Им не нужно реализовывать интерфейс .
Методы / свойства интерфейса могут быть абстрактными или даже виртуальными. Таким образом, дело до подклассов, чтобы фактически реализовать их.
источник