2010-04-24 18 views
108

Mój kod testowy w C#:C#: Klasy abstrakcyjne muszą implementować interfejsy?

namespace DSnA 
{ 
    public abstract class Test : IComparable 
    { 

    } 
} 

wyników w następujący błąd kompilatora:

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

Od klasy Test jest klasa abstrakcyjna, dlaczego kompilator wymaga go implementować interfejs ? Czy nie powinno to być obowiązkowe obowiązkowe dla klas konkretnych?

+0

Haha. Napisałem jedną rzecz, a następnie zdecydowałem się ją zmienić. Przepraszam. :) – Joel

+0

Opierając się na pochlebstwach i komentarzach na temat zaakceptowanej odpowiedzi, wierzę, że spadki pochodzą z powodu sposobu sformułowania pytania. OP pyta "dlaczego tak jest", który byłby poza zakresem stackoverflow. Napotkawszy to osobiście, pytanie brzmi bardziej "Czy coś mi brakuje? Czy naprawdę muszę dostarczać implementacje? Czy to nie oznacza, że ​​jest to klasa abstrakcyjna?" Na co odpowiedź brzmi: "Nie, nie musisz dostarczać * implementacji * (co naruszałoby cel zajęć abstrakcyjnych), ale oto, co musisz zrobić, aby Twoja sytuacja zadziałała." – ToolmakerSteve

Odpowiedz

96

W języku C# nadal definiuje się metody, ale nie podaje się ciała i oznacza się je jako abstrakcyjne. Tak:

interface IFoo 
{ 
    void Bar(); 
} 

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

Albo inaczej mówiąc: ty nie trzeba „wdrożyć” to (co byłoby straszne ograniczenie abstrakcyjnych klasach); jednak w języku C#, musisz musisz powiedzieć kompilatorowi, że celowo przekazujesz klucz do konkretnych podklas - a powyższy wiersz kodu pokazuje, jak to zrobić.

[Brak komentarzy na temat komentarzy i zapisów na dole, które narzekają, że nie jest to odpowiedź na pytanie; Ktoś, kto przyjdzie do stackoverflow, po otrzymaniu tego błędu kompilatora, ale mając klasę abstrakcyjną, w której byłoby błędem dostarczać implementację, utknąłby bez dobrego rozwiązania - musiałby napisać metody implementacji, które rzuciłyby wyjątki runtime, przerażającą pracę wokół - dopóki nie mają powyższych informacji. Niezależnie od tego, czy jest to dobre, czy złe, C# wymaga tej jednoznaczności jest poza zakresem stackoverflow i nie dotyczy pytania ani tej odpowiedzi.]

+0

Szukam podobnej odpowiedzi, ale w moim przypadku mam 2 interfejsy (np. IFoo1 i IFoo2) z tą samą nazwą metody i mam pewne problemy z oznaczaniem ich jako abstrakcyjne w mojej klasie podstawowej (abstrakcyjnej). Możesz pomóc? – Ben

+0

Nie wyjaśnia, dlaczego abstrakcyjny spadkobierca nie musi implementować podstawowych "abstrakcyjnych członków". – AgentFire

+2

@Ben Właśnie zobaczyłem twój komentarz. Prawdopodobnie już to odkryłeś, ale na wypadek, gdyby ktoś inny tego potrzebował. Sprawdź jawne implementacje interfejsu: http://msdn.microsoft.com/en-us/library/ms173157.aspx – Joel

3

Nie muszą one faktycznie implementować interfejsu.
Metody/właściwości interfejsu mogą być abstrakcyjne lub nawet wirtualne. Tak więc aż do podklas, aby faktycznie je wdrożyć.

7

W odróżnieniu od języka Java, w języku C#: "klasa abstrakcyjna musi zapewniać implementacje wszystkich elementów interfejsów wymienionych na liście klasy podstawowej, jednak klasa abstrakcyjna może mapować metody interfejsu na metody abstrakcyjne . "

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

+1

Super jasna odpowiedź i wspaniale, że zapewniasz obie sytuacje, również może czasami chcieć zaimplementować zachowanie w klasie bazowej – VinKel

+0

Powstaje jedno pytanie: dlaczego te deklaracje C# (które oczywiście są) muszą istnieć w klasach abstrakcyjnych, które w przeciwnym razie mogłyby być zwięzłe i krótsze (w ten sposób zepsuć klasy)? W moim projekcie C# mam wiele abstrakcyjnych klas i interfejsów - a to co robię przez większość czasu to kopiowanie i wklejanie deklaracji metod w Visual Studio. – forsberg

Powiązane problemy