lista klas implementujacych interfejs

0

Czesc!
Przepraszam za brak polskich znakow, w tym momencie srodowisko mnie ogranicza.
Nie jestem dobry w C#, niemniej jednak zaczynam sie udzielac w pewnym projekcie, i napotkalem pewien problem. Bede wdzieczny za sugestie rozwiazania, podejrzewam ze da sie to rozwiazac jakimys typowo C#'owym mechanizmem :)

Mam funkcje przyjmujaca dowolnego typu obiekt, oraz pewien interfejs Identifiable:

vod f(object o) {...}
interface Identifiable {
   bool Identified;
}

Posiadam tez pewna hierarchie klas, z ktorych niektore implementuja wspomniany interfejs Identifiable, przykladowo:
Item -> Weapon -> Meele -> Sword (Identifiable) -> Axe -> ExecutionersAxe
Item -> Weapon -> Distance -> Bow (Identifiable) -> CompositeBow
Do funkcji podaje dzieci, np.:
f(ExecutionersAxe);
f(CompositeBow);

Wewnatrz funkcji f() chce nadac wartosc zmiennej Identified pochodzacej z interfejsu. W tym celu musze rzutowac obiekt przeslany jako argument na jakas klase, ktora implementuje interfejs. Dotychczas robilem to za pomoca warunkow sprawdzajacych dla kazdej klasy ktora implementuje interfejs czy obiekt jest jej typu. W ten sposob:

void f(object o) {
  if ( o is Sword ) {
    Sword ob = (Sword) o;
    ob.Identified = true;
  } else if ( o is Bow ) {
    Bow ob = (Bow) o;
    ob.Identified = true;
  } else if ( .... ) // itd. itd.
}

Narzuca sie pytanie: czy mozna to jakos zautomatyzowac za pomoca sprytnej petli albo innego mechanizmu, aby nie trzeba bylo recznie wpisywac kazdej klasy implementujacej Identifiable? Jedna wskazowka, ktora mysle ze moze posluzyc do jakiegos rozwiazania jest fakt, ze wszystkie takie klasy maja wspolnego przodka Weapon... moze dalo by sie zrobic jakas petle po wszystkich klasach potomnych od Weapon i sprawdzac czy obiekt jest ich typu? A moze da sie po prostu bezposrednio sprawdzic ktore klasy implementuje interfejs Identifiable? Jestem otwarty na wszelkie mozliwe rozwiazania.
Znalazlem podobne pytanie, ale bez odpowiedzi: Jak zdobyć informację o wszystkich klasach implementujących interfejs leżących na classpathie?

1
void f(object o)
{
    Identifiable identifable = o as Identifable;
    if(identifable != null)
        idengifable = true;
}

lub chyba lepiej tak:

void f(Identifable identifable)
{
    if(identifable != null)
        idengifable = true;
}
//i wywołanie
f(myObject as Identifable);
0

Wspaniale :) dzięki! Nie wiedziałem, że można rzutować na interfejs.

1
dam1an napisał(a):
void f(Identifable identifable)
{
    if(identifable != null)
        idengifable = true;
}
//i wywołanie
f(myObject as Identifable);

To as jest kompletnie zbędne, nie wstawisz do takiej funkcji obiektu który nie dziedziczy po Identifable więc rzutowanie jest kompletnie bez sensu.

0
Elgcahlxukuth napisał(a):

Wspaniale :) dzięki! Nie wiedziałem, że można rzutować na interfejs.

wtedy interfejsy nie miałyby sensu

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