klasy...?

0

Mam kilka swoich klas zadeklarowanych, przykładowych, obojętnie jakich.

Teraz :

<font color="blue">Initialization</span>
...

<font color="blue">Finitialization</span>...

Skąd wiadomo, dla jakich klas definiuje te polecenia..znaczy się - a co jeśli chciałbym dla każdej z moich klas osobny blok initialization... - w przykładach jest tylko na jednej klasie i nie ma problemu. A co z większą ich ilością? Jak przypisać "initialization" do konkretnej klasy.

Drugie pytanie:

Dwie klasy (bazowa i pochodna) mają tę samą metodę o tej samej nazwie oraz te same parametry. Czy klauzura "<font color="blue">reintroduced</span>" powoduje wskazanie kompilatora na klase pochodną (aktualną)? Czy jest jakaś inna klauzura?

Trzecie pytanie :) :

Jak wywołać metodę klasy bazowej "trzeci poziom w górę", które też jest w bazowej o jeden poziom wyżej, i również u nas w klasie. "<font color="blue">Inherited</span>" wywoła klasę jeden poziom wyżej w klasie bazowej, a jak wywołać ją dwa poziomy wyżej, trzy.... ? Czy można inherited zastosować z parametrem?

0
  1. Jeżeli bazowa procedura/funkcja ma klauzule virtual lub dynamic w tedy wystarczy do pochodnej dać override i nawet przez typecasting będzie się odwoływać do overridowanej

  2. Inhertied odwołuje się do poziomu o jeden nizej, czyba że dasz z parametrem, tzn jeżeli klasa bazowa 1 ma po prostu Create, pochodna od niej Create(Aowner: TComponent), a trzecia ma Create(AOwne: TComponent, State: TCompState) to w trzeciej danie Inhertied Create; odwoła się do poziomu 1. Inhertied bez parametru teoretycznie odwołuje się do bazowej metody z identycznymi parametrami co metoda obecna, czyli tak czy siak najlepiej specyfikowac parametr inhertied jezeli parametry kolejnych metod są różne

Ale zagmatwane, co ;-)

0

2 i 3 nie wiem.

1 - moim zdaniem initialization i finalization nie mogą należeć do klasy. Są to części Unitu, wykonywane odpowiednio na początku programu i przy jego zakończeniu (o ile program nie został zatrzymany przez Halt). Nie są częścią klasy. W jakiś sposób ich odpowiednikiem w obrębie klasy są konstruktor i destruktor.

0

Odnośnie 3:

To chyba pozostało mi wypisywanie we wszystkich klasach między aktualną a bazową (mocno wyżej w hierarchii) w danej metodzie sprawdzenie Sendera i jeśli się zgadza to "inherited" - na zasadzie "podaj piłkę wyżej"... :-/

0

1 - zgadza się, initialization i finalization działają na cały unit. Finalization jest wykoinywane nawet podzczas zamukania Delphi, dla wszystkich zainstalowanych komponentów!
Dla konkretnej klasy zastosuj constructor i destructor:

 procedure bla bla bla;
 constructor Create;
 destructor Destroy;
 proce...

:P
(Ich nazwy to ZAWSZE Create i Destroy)
Pamiętaj też aby na poiczatku Create dać rozkaz inherited, aby wykonał Create z klasy rodzica (chyba że tego nie chcesz....)

2 - a może spróbuj też override? nie wiem :)

0

To i ja dołożę swoje...
Ad. 1
Initialization jest wykonywane w momencie ładowania modułu, czyli jeszcze przed wykonaniem jakiegokolwiek polecenia z pliku dpr.
Przykład:

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Unit1 in 'Unit1.pas',
  Unit2 in 'Unit2.pas';

begin
  WriteLn('Test');
  ReadLn;
end.

unit Unit1;

interface

implementation

initialization
  WriteLn('Unit1');

end.

unit Unit2;

interface

implementation

initialization
  WriteLn('Unit2');

end.

Najpierw jest uruchamiany plik dpr i w kolejności ładowane są moduły Unit1 i Unit2. W takiej też kolejności pojawiają się odpowiednie wpisy na ekranie. Ale dodajmy jedynie do uses w pliku Unit1 moduł Unit2:

unit Unit1;

interface

implementation

uses Unit2;

initialization
  WriteLn('Unit1');

end.

Unit1 ładuje najpierw Unit2, więc wcześniej zostanie wykonana część initialization w Unit2, a potem w Unit1.

Finalization jest wykonywane w odwrotnej kolejności niż initialization.

ikari: Nie musi nazywać się Create i Destroy!! Możesz dać dowolną nazwę:

type TTest = class
  public
    constructor Utworz;
    destructor Usun;
  end;

constructor TTest.Utworz;
begin
  WriteLn('fas');
end;

destructor TTest.Usun;
begin
end;

Jeżeli potrzebujesz dziedziczyć jakąś procedurę, która ma inną nazwę w poprzednim to:

constructor TTest.Utworz;
begin
  inherited Create;
  WriteLn('fas');
end;

Ad. 2
Nie rozumiem problemu.

Ad. 3
Nie próbowałem.

0

Em.. faktycznie... Constructory dopuszczają różne nazwy. To ja bałem się ich zmieniać odkąd przy zmianie nazwy zmiennej w procedurach SetSomething wszystko się krzaczyło :)
<font color="white">Za to (na pewno?) musi się on znajdować w sekcji public, nie może być deklaracją prywatną.</span>

0

TBase
TSth
TMyClass

Z TMyClass odwołanie do metody TSth:

inherited nazwa(parametry);
TSth.nazwa(parametry);

Do metody TBase:

TBase.nazwa(parametry);

Kapiszi?

0

Kapiszi Vogel.. zawsze zapomina się o najprostszym rozwiązaniu... :-/

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