Mój kod testowy w C #:
namespace DSnA
{
public abstract class Test : IComparable
{
}
}
Powoduje następujący błąd kompilatora:
error CS0535: 'DSnA.Test' does not implement interface member
'System.IComparable.CompareTo(object)'
Ponieważ klasa Test
jest klasą abstrakcyjną , dlaczego kompilator wymaga jej do zaimplementowania interfejsu? Czy ten wymóg nie powinien być obowiązkowy tylko w przypadku zajęć konkretnych?
c#
syntax
interface
abstract-class
bguiz
źródło
źródło
Odpowiedzi:
W języku C # klasa implementująca interfejs jest wymagana do zdefiniowania wszystkich członków tego interfejsu. W przypadku klasy abstrakcyjnej wystarczy zdefiniować te elementy za pomocą
abstract
słowa kluczowego:interface IFoo { void Bar(); } abstract class Foo : IFoo { public abstract void Bar(); }
Albo inaczej: nie musisz tego „implementować” (co byłoby okropnym ograniczeniem klas abstrakcyjnych); jednak w C # musisz powiedzieć kompilatorowi , że celowo przekazujesz złotówkę konkretnym podklasom - a powyższy wiersz kodu pokazuje, jak to zrobić.
Komentarze i głosy przeciw, narzekające, że nie jest to odpowiedź na pytanie, nie mają sensu. Ktoś, kto przychodzi do Stack Overflow, otrzymawszy ten błąd kompilatora, ale mając klasę abstrakcyjną, w której dostarczenie implementacji byłoby błędem, utknął bez dobrego rozwiązania - musiałby napisać metody implementacji, które rzucałyby wyjątki w czasie wykonywania, horrendalna praca -okoła - dopóki nie uzyskają powyższych informacji. Czy to dobrze, czy źle, że C # wymaga tej jawności, znajduje się poza zakresem przepełnienia stosu i nie ma znaczenia dla pytania ani tej odpowiedzi.
źródło
Foo
na,public abstract void IFoo.Bar();
a otrzymasz skargi, że „public” i „abstract” nie są poprawnymi modyfikatorami.W przeciwieństwie do Javy, w języku C #: „Klasa abstrakcyjna musi zapewniać implementacje wszystkich elementów członkowskich interfejsów wymienionych na liście klas bazowych klasy. Jednak klasa abstrakcyjna może mapować metody interfejsu na metody abstrakcyjne”.
https://msdn.microsoft.com/en-us/library/Aa664595(v=VS.71).aspx
źródło
Nie muszą faktycznie implementować interfejsu .
Metody / właściwości interfejsu mogą być abstrakcyjne lub nawet wirtualne. Tak więc od podklas zależy, czy faktycznie je zaimplementują.
źródło