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.]
Haha. Napisałem jedną rzecz, a następnie zdecydowałem się ją zmienić. Przepraszam. :) – Joel
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