Autor Téma: V rodičovi chcem volať metódu potomka. Je to možné?  (Přečteno 594 krát)

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4194
  • Karma: 37
    • Verze Delphi: XE7 professional

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?
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1752
  • Karma: 67
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:V rodičovi chcem volať metódu potomka. Je to možné?
« Odpověď #1 kdy: 09-12-2018, 11:55:02 »
Pokud zrusis striktne privatnimu bloku strict restrikci, budou cleny viditelne v danem modulu. Metoda oznacena jako virtual ovsem do takoveho bloku nepatri. Ta je vhodna spis do protected bloku.
« Poslední změna: 09-12-2018, 12:02:57 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4194
  • Karma: 37
    • Verze Delphi: XE7 professional
Re:V rodičovi chcem volať metódu potomka. Je to možné?
« Odpověď #2 kdy: 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í.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1752
  • Karma: 67
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:V rodičovi chcem volať metódu potomka. Je to možné?
« Odpověď #3 kdy: 09-12-2018, 15:43:34 »
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í.

Nic to nemeni na faktu, ze strict restrikci se omezuje jen videtelnost dane tride. Ani potomek takove tridy ve stejnem modulu cleny v takovem bloku neuvidi.
« Poslední změna: 09-12-2018, 15:46:04 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4194
  • Karma: 37
    • Verze Delphi: XE7 professional
Re:V rodičovi chcem volať metódu potomka. Je to možné?
« Odpověď #4 kdy: 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.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4194
  • Karma: 37
    • Verze Delphi: XE7 professional
Re:V rodičovi chcem volať metódu potomka. Je to možné?
« Odpověď #5 kdy: 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 :)
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline starous

  • Mladík
  • **
  • Příspěvků: 58
  • Karma: 2
Re:V rodičovi chcem volať metódu potomka. Je to možné?
« Odpověď #6 kdy: 09-12-2018, 15:50:28 »
Poor
Rated 1 time
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.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4194
  • Karma: 37
    • Verze Delphi: XE7 professional
Re:V rodičovi chcem volať metódu potomka. Je to možné?
« Odpověď #7 kdy: 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.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2509
  • Karma: 131
    • Verze Delphi: D2007, XE3, DX10
Re:V rodičovi chcem volať metódu potomka. Je to možné?
« Odpověď #8 kdy: 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.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4194
  • Karma: 37
    • Verze Delphi: XE7 professional
Re:V rodičovi chcem volať metódu potomka. Je to možné?
« Odpověď #9 kdy: 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.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1752
  • Karma: 67
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:V rodičovi chcem volať metódu potomka. Je to možné?
« Odpověď #10 kdy: 09-12-2018, 21:01:40 »
Nechapu co na cem kulha. Dodam vsak, ze je nepsanym pravidlem umistovat virtualni metody do bloku protected. A pokud se onzaci blok jako strict private, pak jeho cleny nevidi ani potomek uvnitr modulu.
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4194
  • Karma: 37
    • Verze Delphi: XE7 professional
Re:V rodičovi chcem volať metódu potomka. Je to možné?
« Odpověď #11 kdy: 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č.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1752
  • Karma: 67
  • SW konzultant
    • Verze Delphi: 2009, Tokyo
Re:V rodičovi chcem volať metódu potomka. Je to možné?
« Odpověď #12 kdy: 09-12-2018, 23:49:41 »
K tomu virtual som písal, že je to chyba

Virtualni metody existuji k pretezovani. Pokud mas v umyslu metody pretezovat, chybou to urcite neni. Mely by vsak byt viditelne minimalne v protected bloku.
« Poslední změna: 09-12-2018, 23:51:15 od Delfin »
I'm a soldier, so don't panic! I know the underground! I like WTFPL license! No more Google, go duck, go!