Forum Delphi.cz

Delphi => Obecné => Téma založeno: Stanislav Hruška 09-12-2018, 10:41:24

Název: V rodičovi chcem volať metódu potomka. Je to možné?
Přispěvatel: Stanislav Hruška 09-12-2018, 10:41:24

Kód: Delphi [Vybrat]
  1.   TCustomObject = class(TObject)
  2.   strict private
  3.     procedure DeleteNode; virtual;
  4.   public
  5.     procedure DeleteRec(const AAutoCommit: Boolean); virtual;
  6. ...
  7. procedure TCustomObject.DeleteRec(const AAutoCommit: Boolean);
  8. ...
  9.   DeleteNode
  10. ....
  11.   TCustomVst = class(TCustomObject)
Rutina DeleteNode patrí logicky do TCustomVst. Ale ten je potomkom TCustomObject a tak sa k nej v TCustomObject neviem dostať.
Má to nejaké riešenie?
Název: Re:V rodičovi chcem volať metódu potomka. Je to možné?
Přispěvatel: Stanislav Hruška 09-12-2018, 15:32:43
To virtual tam nemá byť - je to chyba. No na otázke to nič nemení.
Metóda DeleteNode logicky patrí do TCustomVst. Preto ju chcem presunúť. V triede TCustomControl (moja hlavná trieda používaná veľmi masívne) som robil veľké upratovanie a toto jediné mi tam visí.
Název: Re:V rodičovi chcem volať metódu potomka. Je to možné?
Přispěvatel: Stanislav Hruška 09-12-2018, 15:46:52
Ešte raz otázka, bez ohľadu na uverejnené definície.
V rodičovi chcem volať metódu, ktorá je definovaná v jeho potomkovi.
Název: Re:V rodičovi chcem volať metódu potomka. Je to možné?
Přispěvatel: Stanislav Hruška 09-12-2018, 15:49:25
Jedno z riešení je definovať ju v rodičovi ako abstract. Ale ja ju tam vôbec nechcem :)
Název: Re:V rodičovi chcem volať metódu potomka. Je to možné?
Přispěvatel: starous 09-12-2018, 15:50:28
Co třeta takto?

Kód: Delphi [Vybrat]
  1.   TCustomObject = class(TObject)
  2.   public
  3.     procedure DeleteRec(const AAutoCommit: Boolean); virtual;
  4. ...
  5. ....
  6.   TCustomVst = class(TCustomObject)
  7.   strict private
  8.     procedure DeleteNode; virtual;
  9.   public
  10.     procedure DeleteRec(const AAutoCommit: Boolean); override
  11. ...
  12. procedure TCustomObject.DeleteRec(const AAutoCommit: Boolean);
  13. begin
  14. ...
  15. end;
  16. ...
  17. procedure TCustomVst.DeleteRec(const AAutoCommit: Boolean);
  18. begin
  19. ...
  20.   DeleteNode;
  21. end;
  22.  

Prostě překryješ v potomkovi přímo metodu DeleteRec a pokud je určitá část kódu stejná, tak si jí vyndej do jiné metody.
Název: Re:V rodičovi chcem volať metódu potomka. Je to možné?
Přispěvatel: Stanislav Hruška 09-12-2018, 15:55:04
Hm, ale zas DeleteRec nemá čo robiť v CustomVst :D Vďaka za námet. Ešte uvidím ako to skončí.
Možno niekto dá iný nápad. To radšej nechám tak ako to je.
Název: Re:V rodičovi chcem volať metódu potomka. Je to možné?
Přispěvatel: pf1957 09-12-2018, 16:15:36
Ešte raz otázka, bez ohľadu na uverejnené definície.
V rodičovi chcem volať metódu, ktorá je definovaná v jeho potomkovi.
To je obecne nemyslny pozadavek: rodic nema nic vedet o tom, ze existuje nejaky jeho potomek a jaky. Takze jedinym resenim je vytvoreni rozhrani, ktere bude definovano na urovni rodice a kazdy potomek ho musi implementovat a rodic bude s temi potomky pres nej komunikovat.

- jednou moznosti je u rodice definovat virtualni metody, ktere pokud chci implementaci vynutit, musi byt abstract
- skutecny interface.
Název: Re:V rodičovi chcem volať metódu potomka. Je to možné?
Přispěvatel: Stanislav Hruška 09-12-2018, 17:23:54
Kedy už začnem poriadne rozmýšľať! (Je to lepšie než to bolo :) , ale nestačí to >:( ) Chcem na riešenie otázky nestačí.
To moje "logicky patrí do CustomVst" pokuľháva na všetky štyri. To že má v názve niečo Vst nestačí. Hlavne ak CustomObject má definované pole na uloženie VST.
Pritom už mám vedomosti na to ;D , aby som došiel k záveru, ktorý napísal pf1957.
Název: Re:V rodičovi chcem volať metódu potomka. Je to možné?
Přispěvatel: Stanislav Hruška 09-12-2018, 22:09:35
Citace
Nechapu co na cem kulha
Nič na ničom. Všetko je v poriadku. pf1957 mi jasne napísal, že vymýšľam somariny.
K tomu virtual som písal, že je to chyba - pozostatok z minulosti a nevšimnutie si toho. Presunul som metódu vyššie, lebo som zistil, že ju nebudem dediť. A virtual tam ostal. Taká nepodstatná vec :)  - ironicky. Už je to dávno preč.