Dostep do pola odleglego rodzica (przodka?)

0

mam jakas tam strukture klas np:
INSTALACJA jest rodzicem PortCOM //dopisane: NIE CHODZI O RODZICA (parent) TYLKO O OWNERA
PortCOM jest rodzicem KOMENDA
KOMENDA jest rodzicem WARTOSC

zaluzmy ze bedac w WARTOSC chce sie dostac do jakiegos pola klasy INSTALACJA.
czy lepiej ten dostep zorganizowac za pomoca konkretnego odwolania:

showmessage(WARTOSC.KOMENDA.PortCOM.INSTALACJA.komunikat);

czy moze lepiej w kazdej klasie zrobic property ktora bedzie zwracala
komunikat rodzica? i wtedy napisac tylko

showmessage(WATOSC.komunikat);

sposob drugi bardziej mi sie podoba i jest bardziej elastyczny, ale czy przypadkiem
przy duzej ilosci 'przodkow' nie spowoduje to nadmiernej ilosci
wywolywanych funckji jedna w drugiej?

sposob pierwszy jest mniej 'elegancki' ale MOZE jest bardziej wydajny?

co o tym myslicie?

0

po to masz dziedziczenie, żeby nie robić takich dziwolągów. Jak chcesz mieć pole widoczne tylko w klasie bazowej i pochodnych to robisz je protected a jak chcesz mieć widoczne wszędzie to public. I to wszystko

0

argh.... zle sie wyrazilem
to nie jest rodzic (parent) tylko OWNER

moj blad:/

no ale pytanie pozostaje nadal
czy wywolywanie funkcji w funkcji w funkcji w funkcji... itd jest lepsze
od bezposredniego odwolania do pola.

pozdrawiam

0
  1. masz te pola jako private/protected czy public
  2. będziesz to wykorzystywał gdzieś indziej czy tylko tu
  3. może lepiej będzie zrobić to na zasadzie dziedziczenia
0

ad 1: public
ad 2: tylko w tu
ad 3: raczej nie. to sa zupelnie rozne obiekty.

sytuacja jest podobna jak z komponentami na formularzu:
chcialbym zeby kazdy komponent mogl zwrocic CAPTION formularza na ktorym lezy.

wiec przycisk musi sie zapytac panel na ktorym lezy,
panel musi zapytac formularz.

jelsi ilosc posrednich obiektow jest nie znana to to jedynym rozwiazaniem jest umieszczenie
we wszystkich posrednich obiektach metody:

function PodajCaptionFormularza: string;
begin
  if self is TForm then
    result := caption
  else
    result := owner.PodajCaptionFormularza;
end;

ale ja dokladnie znam ilosc i typy wszystkich posrednich obiektow wiec moze
efektywniej byloby napisac takie tasiemcowe odwolanie:

showmessage(przycisk.owner.owner.caption)
0

no to do tego nie prościej tak

var
a: TComponent;
begin
a := przycisk;
while not ((a is TForm) or (a <> null)) do
a := a.Owner;
if a <> null then
ShowMessage(a.Caption);
end;

bez łańcuszków, właściwości itd

0

rzeczywiscie takie rozwiazanie jest niezle.

ALE

generalnie mi chodzi o to czy stosowanie tych wlasnosci (property)
w taki sposob jak napisalem nie odbije sie negatywnie na wydajnosci programu.

wiem ze do osiagniecia 'stack overflow' (mozna go osiagnac przy nieskonczonej rekurencji a moja funkcja dziala podobnie)
musialbym stworzyc mega-turbo-ogromny ciag obiektow, ale chcialbym unikac zlych przyzwyczajen.

1 użytkowników online, w tym zalogowanych: 0, gości: 1