Złożone klasy generyczne

0

witam,

Mam dwie klasy generyczne:
Public class a<T,U>
Oraz
Public class b<T,U,Z> : a<T,U>
B dziedziczy bezposrednio z a

Czy znacie moze jakas sztuczke aby zachowac logiczny sens jak wyzej ale aby w klasie b niedeklarowac T i U, a pobrac je jedynie z a?

Zalozmy, ze mam jakas klase dziedzicząca z a<T,U> nazwijmy ja C.
Moge wiec napisac:
Public class b<T,U,Z> : c
A chcialbym aby bylo
Public class b<Z> : c

I teraz sens pytania:
Czy da sie zrobic tak aby w klasie generycznej dowiedziec sie jaki typ ma T i U bezposrednio z klasy c, tak aby uzyc tych typow np. w propertisach generycznych?
Czyli: public T jakasWlasciwosc(U jakasWartosc)

1

Czy znacie moze jakas sztuczke aby zachowac logiczny sens jak wyzej ale aby w klasie b niedeklarowac T i U, a pobrac je jedynie z a?

Przecież to nie ma sensu. Nie możesz dziedziczyć z klasy, która ma parametry generyczne i nie chcesz ich określić. Nie możesz napisać class B : C<T, U>, bo nie wiadomo czym są T i U. Możesz natomiast je sprecyzować na tym etapie, tj. napisać class B : C<int, double>. Ale jeżeli parametry znasz na etapie deklaracji to możesz je użyć i w definicji - pisząc z palca.

0

Rev:

Ja to wszytko rozumiem, ale chodzi o taki przypadek:

Mam klase a<int, string>

Potem zakladam klase a : b

Pisze dokladnie

Public class a : b

I chce teraz w klasie a wykorzystac parametry generyczne z b tak abym mogl je wykorzystac w metodach klasy a

Np.

Public int Metoda(string parametr)

Oczywiscie int i string to generyki z klasy b

A po co to? Bo mam taki projekt, gdzie klasy generyczna sa bardzo rozbudowane maja po 10 generykow i dziedziczenie jest wielopoziomowe. Powoduje to, deklarujac klasy naglowek klasy ma po 1000 znakow, powtarzaja sie caly czas te same typy w generykach. Chce wiec wiedziec czy jest jakas metoda wyciagania generykow z innych generykow, a nie przepisywanie typow, bo tworzy to bezsensowna prace...jak maszynka do robienia klas. Poza tym zdarzaja sie bledy i sa problemy z ich znalezieniem.

Pozdrawiam,

0

W Scali jest na to rozwiązanie - typy jako pola w klasie: http://www.scala-lang.org/node/105 :P

I wlasnie czegos takiego szukam ale w c#

0

Więc zakładając, że mamy class A : B<int, string> { } jaka różnica będzie pomiędzy napisaniem int Metoda(string argument) { }, a jakąś kosmiczną składnią: PIERWSZY_PARAMETR_GENERYCZNY_KLASY_B Metoda(DRUGI_PARAMETR_GENERYCZNY_KLASY_B argument)? I tak i tak piszesz klasę pod skonkretyzowaną generyczna klasę bazową. I tak te typy w jakiś sposób będziesz musiał napisać, stukania w klawisze ci to nie zaoszczędzi. Jeżeli tak bardzo ci zależy na tym, by tych konkretnych typów nie pisać to dodaj jednak do tej klasy A parametry generyczne i na koniec skonkretyzować ją dziedzicząc z niej jakimś wrapperem: W : A<int, string>.

0

Rev:
Jeśli zamiast int i string podstawisz Lalala<Lololo, Trololo, Oleoleoel, Lala<Lolo>> i tym podobne, a potem zrobisz 10 poziomów dziedziczenia i tylko na ostatnim zrobisz konkretyzacje metod, to wtedy trzeba będzie się namachać przy pisaniu nagłówków klas.

0

Jeżeli chodzi tylko i wyłącznie o schludność takiego kodu to mogę polecić pisanie deklaracji metod na wiele linii, coś, z czego się często stosuje w C++ (pomimo istnienia czegoś na wzór tych typów jako pól w Scali: typedefy) albo, jeżeli to możliwe, częstsze konkretyzowanie tych generycznych typów, tj. tworzenie tych pustych wrapperów - coś jak globalny typedef. Lokalnych, na poziomie klasy, w C# nie ma.

0

albo, jeżeli to możliwe, częstsze konkretyzowanie tych generycznych typów, tj. tworzenie tych pustych wrapperów - coś jak globalny typedef

Nie wiem czy rozumiem - autor chciał właśnie rozszerzyć skonkretyzowaną klasę, która to może być i pustym wrapperem, ale chciał oszczędzić sobie powtarzania w kółko tych samych parametrów i wyciągnąć je jeszcze wyżej z hierarchii.

Typedef to nie jest odpowiednik abstrakcyjnych typów-pól. Abstrakcyjny typ-pole to coś co zachowuje się jak wirtualna metoda, tzn następuje nadpisywanie tych typów schodząc w dół hierarchii klas.

1 użytkowników online, w tym zalogowanych: 0, gości: 1