Rozważmy następujący problem:C# metoda abstrakcyjna z implementacją tylko klasy podstawowej?
Masz klasę "A", która służy jako klasa podstawowa dla wielu innych podobnych klas, np. klasa o nazwie B.
Klasa A jest użyteczny w niej (i już używana w każdym miejscu) i dlatego nie jest abstrakcyjna.
Sedno polega na tym, że teraz chcesz wymusić nowy protokół wymagający, aby wszystkie klasy dziedziczyły po A (łącznie z samym A), aby zaimplementować metodę "func()". Jeśli klasa podrzędna zapomni implementować func(), powinien wystąpić błąd kompilatora.
class A {
A func() { ret new A(...) }
}
class B : A {
A func() { ret new B(...) }
}
class C : A {
// Should give error : no func()
}
Czy problem jest jasny? Nie mogę tworzyć abstrakcji A :: func(), ponieważ chcę nadal używać A jako konkretnej klasy. Nie mogę uczynić go wirtualnym, ponieważ spowoduje to, że podklasy spowodują powrót do super klasy (i nie dadzą błędów kompilatora).
Jedyną rzeczą, która jest bliska znalezienia rozwiązania, jest utworzenie nowej abstrakcyjnej klasy A * i wszystkie typy niestandardowe dziedziczą z tego i zastępują wszystkie bieżące zastosowania A jako konkretną klasę z nową klasą "DefaultA", która dziedziczy po ZA*. To wydaje się nieporządne. Proszę mi powiedzieć, że jest jakiś inny sposób na zrobienie tego?
Twoje "niechlujne" rozwiązanie wydaje mi się właściwe. –