Zdravim, mam Interface a 2 triedy, ktore dedia z interfacu. Tie triedy maju clenov, metody... zdedenych od interfacu + vlastne (public). Ide mi o to aby v inych triedach (napr GUI) som nemusel castnut na tu potrebnu triedu, ktoru prave potrebujem. Poradte mi ak to robim zle. Dik
Fórum › .NET
Dedenie z interfacu
To mnn : Není mi jasné, co vlastně chceš. Zkus to lépe formulovat.
ak to chápem dobre chceš pristupovať k verejným členom interface-u nejakej instance triedy, ktora od neho dedi, bez toho, aby si ju explicitne pretypoval ? No ale načo by si ju mal pretypovavať ? ibažeby si ju definoval ako ten interface a na pristup by ti stačilo napisať "Objekt.PremennaInterfaceu". Takže uveď priklad alebo to trochu lepšie opiš.
interface IRozhranie
{
void MetodaA
}
class TriedaA : IRozhranie
{
void MetodaA()
{
//nejaky kod
}
void MetodaC()
{
//nejaky kod
}
}
class TriedaB : IRozhranie
{
void MetodaA()
{
//nejaky kod
}
void MetodaB()
{
//nejaky kod
}
}
Ked zavolam MetodaA tak je to v pohode. Ale ked chcem zavolat MetodaB alebo MetodaC tak musim pretypovat na pozadovanu triedu. Nedalo by sa nejako lepsie toto vyriesit?
mnn
Interfaces jsou právě od toho, abys přetypovávat nemusel. Definují nějaký obor metod, které třídy, které daný interface implementují, budou podporovat. Pokud potřebuješ metodě předávat argument, který bude instancí nějakého interface a potřebuješ na něm volat určitou metodu, přidej ji do interface. Tohle, oč se nažíš pěkně „smrdí“ :o) Doporučuji jiný návrh aplikace, pokud to „prostě nemůžeš udělat jinak“.
To mnn : Nelze. Pokud chceš volat metody, které nejsou definované na úrovni rozhraní, tak to prostě musíš přetypovat.
bukaj: OK, cize ak v interfaci dam tie metody (cize A,B,C) a triedaB nebude podporovat metoduC tak vyhodim exception NotSupportedException a zachytavat v try..catch? Lebo ako pozeram tak napr vo WinForms to takto je. Dalsia rezia na zachytenie vynimky a osetrenie…
mnn
OK, cize ak v interfaci dam tie metody (cize A,B,C) a triedaB nebude podporovat metoduC tak vyhodim exception NotSupportedException a zachytavat v try..catch?
Ne, v tom případě je to napsané pěkně blbě. Pokud posíláš do metody instance různých tříd díky tomu, že implementují stejné rozhraní, měl bych na instaníchích používat pouze metody imeplementované v rozhraní. Jestli jejich metody voláš podle toho, jak na co se ti to podaří přetypovat, pak píšeš pěkně humusácky :o) Což takhle přetížené metody, hm?
Lebo ako pozeram tak napr vo WinForms to takto je.
Pokud s nimi musíš dělat a je to tam takhle, tak tě lituji.
To bukaj : Ne, není to tam tak. ;) Občas ale nastane situace, kdy je třeba implementovat nějaké rozhraní a není žádoucí, aby byla některá z definovaných metod podporována.
bukaj: Tu ide o to ze cast kodu ktora pouziva instancie tych tried, pouziva len metody definovane v Interfaci (cize tomu kodu je jedno ci sa za tym skryva A alebo B trieda). Zvysok kodu musi vediet ci sa jedna o trieduA alebo trieduB.
mnn
Tu ide o to ze cast kodu ktora pouziva instancie tych tried, pouziva len metody definovane v Interfaci (cize tomu kodu je jedno ci sa za tym skryva A alebo B trieda). Zvysok kodu musi vediet ci sa jedna o trieduA alebo trieduB.
To je tak těžké kód, kterému „je to jedno“, oddělit od třídně specifického zbytku? :o)
Když už to musí být, tak to přece můžeš řešit takhle:
private IRozhranie test = new TriedaA();
test.MetodaA();
if(test is TriedaA)
{
(test as TriedaA).MetodaC();
}
else if(test is TriedaB)
{
(test as TriedaB).MetodaB();
}
Ale osobně si myslím, že by se to mohlo řešit elegantněji.
To mnn : Přímá náhrada za toto řešení v podstatě není. Elegantněji by se mohl vyřešit až konkrétní případ (resp. mohlo by se najít úplně jiné řešení), v teoretické rovině to není možné.
Editoval djanosik: A tak jsem to taky ve svém předchozím příspěvku myslel.
To mnn : Ne a zdrž se prosím takových příspěvků, nikam to nevede. Nemám ti víc jak poradit.
To mnn : To řikáš ty. Já to napsal jako odpověď na otázku a ne jako že ti nechci poradit. Asi to budu muset nějak rozseknout.
BTW: Forum je od toho, aby se člověk mohl zeptat na řešení problémů, které není schopen sám objevit. Nikoliv od toho, aby tady každej druhej sobecky mrhal časem ostatních lidí. Ještě chvíli pokračuj a začnu se tím opravdu zabývat.
mnn
Ooooh, a ja hlupak som si myslel ze forum tu je od toho aby sa tu radilo a nie aby sa tu ignorovali problemy… lol
Jestli hledáš bandu blbců, co to napíšou za tebe, jsi tady špatně ;o)
Tvůj hlavní problém je v tom, že celý návrh je blbě. Chceš řešení? Celé to zahoď a udělej znovu.
To mnn : Už jsem ti snad řekl, že to nelze řešit v teoretické rovině (je to stejné jako přemýšlet nad tím, jak dostat obsah ze zavřené krabice když ani netušíme co je uvnitř). Je třeba konkrétní případ. Tento thread je dále bezpředmětný. Locked.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Dedenie a vlakna — založil vreckovka
C++ dedenie triedy — založil Marbulinek
Dedenie vlastnej class — založil bozole_sk
Angular - dedenie komponentov — založil Jan
Moderátoři diskuze