"Przeciazanie" funkcji

0

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.

0

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

0

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.

0

jesli te funkcje maja przyjmowac inne parametry to w klasie bazowej mozesz napisac je z 'overload' w innym wypadku dziedziczenie i override

0

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 ??

0

Może być, jednak zamień:

A.make(ADDR(obsluga_A));

na

A := mojaklasa.make(ADDR(obsluga_A));
0

Dlaczego akurat tak ? O ile wiem to to samo, ale mozliwe ze nie wiem :>

0

Bo A to niezainicjowany wskaznik na klase i nie mozna z niego wywolac zadnej metody (nawet konstruktora).

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.