2011-02-01 30 views
10

Piszę klasę abstrakcyjną za pomocą metody abstrakcyjnej (dlatego wszystkie klasy dziedziczące z niej muszą implementować tę metodę). Nie chcę jednak określać parametrów, które musi stosować metoda, ponieważ każda metoda może przyjmować różne lub żadne parametry. Tylko nazwa i zwracana wartość powinny być takie same.Definiowanie metody abstrakcyjnej bez określania parametrów

Czy istnieje sposób to zrobić w języku C#?

Dzięki za pomoc!

Odpowiedz

16

Nie, a byłoby to bezcelowe. Jeśli nie zadeklarowałeś parametrów, nie byłbyś w stanie wywołać metody podanej tylko odwołaniem do klasy bazowej. Taki jest sens abstrakcyjnych metod: pozwolić rozmówcom nie dbać o konkretną implementację, ale dać im interfejs API do użycia.

Jeśli osoba dzwoniąca musi znać dokładną sygnaturę metody, oznacza to, że jest ona powiązana z konkretną implementacją, przez co abstrakcja jest zasadniczo bezużyteczna.

Może gdybyś mógł podać więcej szczegółów, moglibyśmy zaproponować bardziej odpowiednie podejście? Na przykład, może być w stanie dokonać typu rodzajowego:

public class Foo<T> 
{ 
    public abstract void Bar(T t); 
} 

betonowe podtypy może albo również mieć charakter ogólny lub czerpać z Foo<string> na przykład.

+0

Każde dziecko musi utworzyć implementację tej metody, która może przyjmować różne typy danych wejściowych, ale będzie generować ten sam typ danych wyjściowych. W ten sposób mogę użyć wyjścia do wykonania logiki mojego programu. – TheBoss

+2

@ TheBoss: Celem klas abstrakcyjnych (takich jak interfejsy) jest umożliwienie ... powszechnej funkcji. Nie można go użyć do zdefiniowania czegoś takiego jak "Potrzebujesz funkcji o nazwie' Foo', która pobiera * niektóre * (lub nie) parametrów i zwraca 'int'; taka funkcja nie może być wyodrębniona, ponieważ jej sygnatura jest niezdefiniowana. Niemożliwe byłoby wywoływanie (bez refleksji) kodu, który odwołuje się do klasy na wyższym poziomie niż ten, w którym zdefiniowany jest konkretny podpis, przerywając jego abstrakcję. –

+0

@TheBoss: Sądzę, że powinieneś popracować przy użyciu Generics, aby rozwiązać swoje wyzwanie projektowe - jak przykład kodu, który napisał Jon. – code4life

0

Nie, nie ma.

Aby przesłonić metodę, należy dopasować podpis metody. Obejmuje to nazwę metody i parametry formatu.

1

To, co próbujesz zrobić, to zapach kodu.

Lepszym wzorcem byłoby zastosowanie abstrakcyjnej klasy ISupportInitialize, a następnie użycie abstrakcyjnej metody Act().

Pomysł polega na tym, że pomiędzy rozmowami do BeginInit i EndInit ma miejsce, kiedy dzieci przygotowują się do działania, zbierając różne informacje, które próbujesz wepchnąć w przypadkowe typy i liczby argumentów. Po skonfigurowaniu i wywołaniu EndInit (tutaj można sprawdzić poprawność) można wywołać streszczenie Act().

Także, proszę, proszę, nie rób tego:

public abstract void Act(params object[] arguments); 

Ludzie będą polować na dół, jeśli można zrobić coś takiego.

+0

To interesujące podejście. Tak więc w klasie powinienem mieć pole boolowskie, które wskazywałoby, kiedy inicjalizacja się zakończyła i dopiero wtedy metoda Act() z powodzeniem wykonałaby inaczej, gdyby rzucił wyjątek? – TheBoss

+0

@ TheBoss standardową techniką jest weryfikacja stanu instancji w EndInit i rzucanie, jeśli nie jest ona w poprawnym stanie. Typy implementujące ten interfejs często stają się niezmienne po wywołaniu EndInit. – Will

Powiązane problemy