Dědičnost ve vložené třídě   zodpovězená otázka

VB.NET, Architektura

Mám třídu A, která obsahuje další podtřídy (B,C,D). Potřebuji vytvořit novou X, která dědí ze třídy A a rozšíří některé metody a vlastnosti třídy B, C a D. Lze to nějak udělat ?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To je hovadina!Naučte se základy práce se třídami a jejich využití.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Stačilo by odpovědět ne. Chápu, že na blbou otázku blbá odpověď, ale tazatelův dotaz hloupý není.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Co myslíte konkrétně tou podtřídou? Že třídy B,C,D dědí z A?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Možná je to "hovadina", možná není. Jde v zjednodušení o toto :

Class Clovek
  Public class Adresa
    'Nějaké vlastnosti a metody
  End Class   
End Class

No a já potřebuji vytvořit např. třídu Kosmonaut, která bude dědit od Clovek a bude mít rozšíření objektu Adresa.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A mohu se zeptat z jakého důvodu máte třídu ve třídě? Pokud všechny vlastnosti ze třídy Adresa přesunete přímo do třídy člověk (a třídu adresa uplně zrušíte), tak pak můžete vytvořit další třídu která bude dědit z člověka a do které si budete moct dopsat co budete potřebovat:

Class Clovek
    'Nějaké vlastnosti a metody třídy člověk (včetně adresy)
End Class

Class Kosmonaut
   Inherits Clovek

    'Třída obsahuje všechno co třída člověk a je možné dopsat další vlastnosti a metody.
End Class

Nebo ta vnitřní třída adresa (což je v podstatě jen taková obálka) má nějaký speciální význam?

Pokud se vám jedná jen o to aby byl kód na pohled hezčí a přehlednější, tak doporučuji používat region, což jsou takové záložky které nemají na fungování kódu žádný vliv:

Class Clovek
   #Region "Obecné vlastnosti"
      'obecné vlastnosti člověka
   #End Region

   #Region "Adresa"
      'adresa atd.
   #End Region
   
End Class

nahlásit spamnahlásit spam 2 / 2 odpovědětodpovědět

To byl jsen velmi zjednodušený příklad. Obálka obsahuje několik podřízených tříd a důvod to opravdu má. Jenže pro dědění to asi bude kamínek úrazu. Budu to nejspíše vyřešit rozšířením původní třídy.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To je prostě tak,když někdo nedodržuje koncepci programování a neosvojil si techniku používání design pattern.Pak v budoucnu právě vznikají "chyby" podobného typu.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Co to tady valíte za kraviny?

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Celé to máte totálně idiotsky navržené. Zřejmě vůbec nechápete základní principy OOP. Normálně by definice Public třídy vůbec neměla být uvnitř jiné třídy.

nahlásit spamnahlásit spam 1 / 3 odpovědětodpovědět

Public třída uvnitř public třídy by být neměla a rozhodně byste neměl vnořené třídy používat zvenčí (pokud jsou privátní, je to v pořádku, to se občas používá).

Principiálně na vnořování tříd není nic špatného, i když je to neobvyklé.

Ve třídě A máte třídy B, C, a D, když třídu A2 podědíte a chcete mít uvnitř třídy B2, C2 a D2, tak B2 poděďte z B, C2 z C a D2 z D. Do třídy A udělejte virtuální metody, které budou vracet instance tříd B, C, D, a v A2 tyto metody přepište, aby vracely B2, C2 a D2 (ikdyž jejich návratový typ bude B, C a D).

Třídám B, C a D a jejich potomkům dejte Protected konstruktor a nevytvářejte jejich instance natvrdo - vždy přes ty "factory" metody.

Jediný průšvih je, že v poděděné třídě A2 budete muset přetypovávat B na B2 (dá se vyřešit pomocí shadowingu, ale to není moc elegantní a nedoporučoval bych to).

Anebo pro to nějak znásilnit generiku, ale obávám se, že to moc nepůjde.

Jaký konkrétní problém řešíte? Nedalo by se to přeci jen udělat bez vnořování tříd?

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Neřeším asi nic neběžného. Mám zařízení, které obsahuje podmnožinu prvků a každý prvek obsahuje další podmnožinu dalších komponent.

Napsal jsem to tedy tak, jak je uvedeno výše.

No a jelikož je několik různých typů zařízení (tedy objektů na nejvyšší úrovni), které se liší v drobnostech právě ve svých prvcích a komponentách, chtěl jsem to řešit přes dědičnost.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
Public Class ClassA

    Public Class ClassB


    End Class


End Class

Public Class ClassC
    Inherits ClassA
    Public Shadows Class ClassB
        Inherits ClassA.ClassB

    End Class
End Class

Ovšem pokud bych se tomu mohl vyhnout, tak bych se tomu vyhl.

Je to asi to co jste chtěl, ale nemá to patřičnou výšku.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Vy to stále nechápete. Jinak si neumím vysvětlit tento naprosto nesmyslný slepenec kódu. Čeho přesně chcete dosáhnout?

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Tak si prosím představte to, že nechápete vy. Co myslíte, je to možné?

PS: Hlasuji tedy NE nynějším hlasování.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Jste obyčejný hlupák. Hlasujte co je libo, ale nejdříve se zkuste zamyslet nad výše uvedeným kódem, speciálně těmito třemi řádky:

Public Shadows Class ClassB
    Inherits ClassA.ClassB

End Class

PS: To že váš komentář absolutně nesouvisí s problémem ani nekomentuji.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Cituji dotaz:Mám třídu A, která obsahuje další podtřídy (B,C,D). Potřebuji vytvořit novou X, která dědí ze třídy A a rozšíří některé metody a vlastnosti třídy B, C a D. Lze to nějak udělat ?

Váš problém asi je v tom, že buť nečtete, nebo odmítáte respektovat to co jiní napsali a doplňujete si tam co chcete. Pak ovšm vaše reakce nejsou vžádném případě adekvátní. A tituli které používáte podle vás souvysí s tématem?

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Nechápete principy OOP a použití klíčového slova Shadows. Již zde bylo naznačeno, že B, C, D nemají co dělat uvnitř A a nerozšiřují se rozšířením A ale jich samotných (jejich rozšířená Private verze už klidně může být uvnitř X). Dále nechápete základy pravopisu.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak si tady nadávejte jak chcete, vy mi pane Linharte za rozčilování nestojíte. To by jste musel být na jiné úrovni.

Přeji všem příjemné zážitky s vámi.

Sbohem, v této diskusi již nebudu na vaše útoky reagovat, prostě je odsuzuji.

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

Upozornil jsem vás na chyby v řešení a v pravopisu, naznačil správný postup. Co chcete víc? A vaše reakce? Mňoukání hlupce, který nemá žádné argumenty. A takto je to u většiny příspěvků, ve kterých s něčím nesouhlasím. Pro podobné anonymní jedince jako výše uvedený omezenec uvádím kompletní ukázkové řešení:

Public Class A
  Private _b As New B
  Public Overridable ReadOnly Property B() As B
    Get
      Return _b
    End Get
  End Property
End Class

Public Class X
  Inherits A
  Private _b2 As New B2
  Public Overrides ReadOnly Property B() As B
    Get
      Return _b2
    End Get
  End Property
  Private Class B2
    Inherits B
    Public Y As Integer
  End Class
End Class

Public Class B
  Public X As Integer
End Class

(viditelnost nových vlastností B2 samozřejmě záleží na jeho oboru platnosti, zde budou nové vlastnosti B2 viditelné pouze uvnitř třídy X)

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback