none
Trieda a dedenie, mensi problem..

    Dotaz

  • Zdravim,
    potreboval by som pomoct s takymto problem, na ukazku:
    Mam 2 triedy, zakladnu a zdedenu triedu od zakladnej:
    class HlavnaTrieda
    {
      public ZdedenaTrieda MetodaY()
      {
        ...
      }
    }

    class ZdedenaTrieda : HlavnaTrieda
    {
      public void MetodaX()
      {
        ....
      }
    }

    Takze pouzivam to takto:
    HlavnaTrieda hlavna = new HlavnaTrieda();
    ZdedenaTrieda zdedena = hlavna. MetodaY();
    zdedena. MetodaX();

    To je OK. Akurat problem je v tom, ze nechcem aby bolo mozne pouzivat z instancie zdedena cleny z hlavnej triedy.
    Cize, aby nebolo uz mozne zavolat: zdedena. MetodaY();
    Este ma napadlo spravit druhu triedu tak aby nededila, ale aby do konstruktora vstupovala instancia hlavnej trieda a by bola v zdedenej triede iba private.

    Vyzera to dost komplikovane, neviem ci som sa spravne vyjadril.
    Dakujem vopred!
    středa 30. září 2009 18:45

Odpovědi

  • Ahoj,

    k prikladu pár drobností.

    a) Nie je zrovna OK urobit rodičovskú triedu závislú na potomkovi. To je tá konštrukcia

          public ZdedenaTrieda MetodaY() v rodičovi.

    Tým vytvoríš cyklickú závislosť a rodič s potomkom sú tuho zviazaný. Kompilátor to prežije, ale dizajn tried ...

    b) Ak sa má nejaká metóda pri dedičnosti dať volať len z inštancie rodiča, potom ho potomok
        - nesmie vidieť (to jest metoda je private, ale potom ani nejde volať z iného miesta než z rodičovskej triedy
        - potomok ho prekryje vlastnou variantou, napr:

           public new ZdedenaTrieda MetodaY()
           {
                throw new MethodNotImplementedException();
           }

    Avšak táto konštrukcia nerieši fakt, že do premenej typu rodič nie je problém priradiť potomka, takže inštancia potomka sa tak dostane k MetodeY z rodiča.
    Ak potrebujete mať istotu, že si inštancia potomka zavolá svoju variantu bez ohľadu na to, v akej premennej je priradený, tak by tie metódy museli byť deklarované takto:

    class HlavnaTrieda
    {
      public virtual ZdedenaTrieda MetodaY()
      {
        ...
      }
    }

    class ZdedenaTrieda : HlavnaTrieda
    {
      public ovveride ZdedenaTrieda MetodaY()
      {
        throw new MethodNotImplementedException();
      }
    }

    Ale aj tak berte do úvahy bod a), čo som napísal a ako doporučenie berte, že rodičovská trieda nemá mať ani tušenia o svojich potomkoch!!! Takže by som to smeroval ako píšete, to jest trieda B má ako privátny členský prvok triedu A a umožní prístup len k vybraným metódam triedy A. 

    Tomáš Havetta
    MCT, MCPD
    neděle 4. října 2009 21:40