Witam
Moje pytanie jest proste stworzylem sobie obiekt CLASS wsrod jej metod znajduje sie
procedure FUNKCJA;
deklaruje
nazwa1,nazwa2: CLASS;
ale kazdy z tych egzemplarzy obiektu bazowego ma miec "przeciazana" procedure FUNKCJA tzn kazda z nich ma robic cos innego. Czy istnieje jakis sposob na modyfikacje tej procedury dla kazdego egzemplarza czy tez jedynym sposobem jest utworzenie nowych obiektow zmienna1 i zmienna2 i dziedziczenie po CLASS oraz dodanie do kazdego nowego obiektu potrzebnej funkcji. Z gory dziekuje za pomoc.
Jak jedna i ta sama funkcja może wykonywać dwie różne rzeczy??
możesz
a) dodać dodatkowy argument do funkcji, a w jej ciele
case znacznik of
1: robi coś;
2: robi inne coś;
3: albo jeszcze inne coś;
end;
b) po prostu przeciążyć funkcję (czyli napisać dwie ale tak, aby różniły się liczbą albo typem parametrów)
c) napisać po ludzku o co Ci chodzi
override; spowoduje, że będziesz mógł tak zrobić ale tylko dla różnych klas (bazowa, podrzędna itd..) ale nie dla różnych egzemplarzy tej samej klasy..
Napisz precyzyjnie o co Ci chodzi.
jesli te funkcje maja przyjmowac inne parametry to w klasie bazowej mozesz napisac je z 'overload' w innym wypadku dziedziczenie i override
Hej wielkie dzieki za odpowiedzi. Chcialem zrobic "klase" prosta w uzyciu. Jest ona umieszczona w module i uzytkownik nie ma prawa jej zmieniac. Instukcja case of odpada, poniewaz zmiana zachowania funkcji wymaga dostepu do kodu modulu. Wersja z klasycznym przeciazaniem (rozne argumenty) tez odpada. Zostaly mi dwie mozliwosci albo dziedziczenie albo cos co wymyslilem jak wstalem. Przekazywanie do konstruktora obiektu adresu funkcji
ADDR(x);
ktora ma dany egzemplarz obslugiwac, a w ciele klasy wywolywac ja call ADDR(x)
ew. far call. Zamieszczam przykladowy kod:
```delphi
uses mojaklasa;
var
A,B : mojaklasa {2 egz. mojego obiektu}
...
procedure obsluga_A;
{tu jakies cialo procedury}
procedure obsluga_B;
...
begin {glowna petla}
A.make(ADDR(obsluga_A));
B.make(ADDR(obsluga_B));
...
end.
A oto fragment implementacji mojejklasy
mojaklasa = object
private
f_ptr : pointer;
procedure zrob_cos;
...
public
constructor make (address:pointer);
end.
...
constructor make(address:pointer);
begin
f_ptr:=address;
....
end;
procedure zrob_cos; assembler; {:)}
asm
Call [f_ptr];
end;
co o tym myslicie ??
Może być, jednak zamień:
A.make(ADDR(obsluga_A));
na
A := mojaklasa.make(ADDR(obsluga_A));
Dlaczego akurat tak ? O ile wiem to to samo, ale mozliwe ze nie wiem :>
Bo A to niezainicjowany wskaznik na klase i nie mozna z niego wywolac zadnej metody (nawet konstruktora).