Jak jednoduse na skladani objektu   otázka

VB.NET

Rekneme ze mam existuji tridu, ktera ma radu vlastnosti a metod. Nyni bych potreboval vytvorit novou tridu, ktera rozsiruje schopnosti puvodni tridy a rad bych to delal pomoci slozeni (composition), tj. uvnitr noveho objektu budu vyuzivat puvodni objekt, ale pres upravene meotdy a vlastnosti nove tridy.

Neexistuje nejaky nastroj, ktery by mi predpripravil novou tridu odkazujici se na pubvodni objekt? Neco jako ze by skopiroval vsechny verejne metody a vlastnosti puvodniho objektu a pripravil mi je jako vlastnosti a metody noveho objektu?

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

Proč nepoužít dědičnost?

Public Class TridaA

    Public Sub MetodaA
    End Sub

    Public Sub MetodaB
    End Sub

End Class

Public Class TridaB
    Inherits TridaA

    Public Sub MetodaC
        MetodaA()
    End Sub

    Public Sub MetodaD
    End Sub

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

Protože v tomto případě jsou třídy NON INHERITABLE:( a navíc poskytují spoustu balastu okolo, který bych rád skryl. Ale zase mají docela dost vlastností a tak hledám nějaký nástroj, který by mi pomohl...

Jen na okraj. Když dědím, jak můžu nějakou public proměnnou skrýt aby se nevyskytovala u dědice?

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

Ke druhému dotazu - tohleto nejde a je to proti principu OOP. Potomek musí mít všechny vlastnosti předka, nemůže z nich ubírat.

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

Pokud jsou třídy dále neděditelné (Noninheritable), což má v mnoha případech svůj důvod, tak s tím nic neuděláte a budete tomu muset přizpůsobit architekturu aplikace.

Jak už bylo řečeno tak zděděný člen se skrýt nedá, ale dá se nahradit jiným členem se stejným názvem pomocí klíčového slova Shadows (pozor, neplést s Overloads a Overrides).

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

OK, moc děkuji.

Takže když nemůžete použít dědění a pracujete se skládáním (composition/aggregation), tak třídy vytváříte ručně? Není na to nějaký nástroj?

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

Zřejmě pletete do objektově orientovaného programování něco uplně jiného. Pokud chci něco zdědit a zjistím že to nejde tak se podívám na hierarchii toho objektu a budu hledat nadřazenou třídu nebo rozhraní které by se dalo použít. Pokud žádné nenajdu tak budu hledat jiné řešení, než opisovat a implementovat všechny členy dané třídy což by bylo stejně k ničemu, protože třídy by byly vzájemně nekompatibilní. Zdá se mi, že se snažíte použít tu Noninheritable třídu jinak než k čemu byla určena...

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

To co chcete se blíží wrapperu, bohužel na to neznám žádný nástroj.

Pokud to ale chcete udělat, určitě by šlo napsat jednoduchý generátor kódu, který to dokáže pomocí reflexe. Výsledek by mohl být třeba:

Public Class MojeNovaTrida
    Protected objekt = New StaraTrida()

    Public Function Funkce1() As Boolean
        Return objekt.Funkce1()
    End Function

    ...

End Class

Práce tak na 2-3 hodiny se vším všudy, pokud to má být univerzální. Rozmyslete si, jestli to opravdu nejde udělat jinak.

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

To je přesně ono. Takže wrapper se tomu říká:)

Každopádně máte pravdu oba - možností je příliš mnoho a nejdřív je nutné zvážit pro a proti.

BTW: ad vytvořit generátor/ to je zajímavý námět:) až nebude co dělat, dokážu si představit strávit na tom nějaký čas. Uvidíme.

nahlásit spamnahlásit spam 0 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