Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno OOP (Delphi) - Ako volať v potomkovi konštruktor z premennej predka (override)?

Pozoruju, že v tom máš trošku hokej. Můžeš myslet dvě možnosti: 1. Děláš nějaký seznam uzlů, kde má každý uzel svého potomka a předka. Nebo se ti jedná o takovýto případ:

TPredek =  class (object)
    Nějaké-deklarace
    Constructor Create (....);
end;
TPotomek = class (TPredek)
    Nějaké-deklarace
    Constructor Create (....);
end;
Pak při vytvoření instance Potomek := TPotomek.Create (x); oba objekty (TPredek a TPotomek) jedno jsou. Self v obou třídách ukazuje na tentýž objekt a není třeba rozlišovat nijak jestli je někde TPotomkem nebo TPredkem. Je to rozlišeno jen umístěním kódu - proto jsou virtuální metody. Aby se dalo z TPredek volat metoda TPotomka, i když jí defakto kompilátor v době kompilace nezná. Není třeba se tím nijak vzrušovat ani to extra zpracovávat, obvykle to kompilátor udělá vždycky dobře - protože objekt je identický a obsahuje všechny metody a vlastnosti (záleží jen, které jsou odkad volatelné - na nestandartní volání je možno v pohodě použít přetypování).

Jestli ti jde skutečně o vytvoření nového potomka takto:
constructor NovyObjekt.Create(Nieco: TPredok);
begin
  Predok := Nieco;
end;
kde Nieco typu TPredok nemá s NovObject vůbec nic společného, nelze to takto udělat. Musíš předávat odkaz na třídu, asi takhle:
TPredok = class (object)
...
end;

TPredokClass = class of TPredok;

NovyObjekt = objekt
  Predok: TPredok;
  ostatne_vlastnosti_a_metody;
  constructor Create(Nieco: TPredokClass);
end;

---
---
constructor NovyObjekt.Create(Nieco: TPredokClass);
begin
  Predok := Nieco.Create (...);
end;

Reakce na odpověď

1 Zadajte svou přezdívku:
2 Napište svou odpověď:
3 Pokud chcete dostat ban, zadejte libovolný text:

Zpět do poradny