inherited ale do wczesniejszej klasy

0

Witam,
Natknąłem się dziś na problem, którego z moją wiedzą i pomocą helpa do Delphi nie jestem w stanie rozwiązać. Mianowicię chciałbym usyskac dostęp do wirtualnej metody klasy nadrzędnej ale nie bezposredniego przodka a tego wcześniejszego. Jak to zrtobić? Myslalem że będzie to inherited z odpowiednim wywołaniem ale nie działa. A konkretnie sytuacja wygląda tak:

type klasa1= class
//...
   protected procedure metoda(...) virtual;
//...
end;

klasa2=class(klasa1)
//...
protected procedure metoda(...)override;
//...
end;

klasa3=class(klasa2)
//...
protected metodajakas(...); // moetodajakas to moze byc rownież metoda override to nie ma znaczenia
//...
end;
implementation
//...

procedure klasa3.metodajakas(...)
begin
inherited metoda(...);// wywołuje metode metoda klasy bezposredniego przodka czyli klasy klasa2.
// A jak w tym miejscu wywołac metodę metoda klasy klasa1 tak by nie wywoływac metody metoda klasy
// bezposredniego przodka czyli kalsy klasa2?

end;

Z góry dziękuję za odpowiedzi i pozdrawiam:)

0

niewydaje mi sie zeby bylo to mozliwe gdyz klasa3 dzidziczy po klasa2 takze najpierw bedzie wywolywana metoda z klasa2 a potem poprzez klasa2 metoda klas-y1. Choc niemam 100% pewnosci ale sam sprawdze teraz :p.

0

No to ja wiem, że tak będzie wywołane przy tym zapisie. Moje pytanie dotyczy tego jak zrobić by "wyłuskać" samą metodę klasy o dwa stopnie wyżej albo trzy stopnie albo więcej.

0

Wywołaj jawnie. Inherited to ułatwienie dla kodera, aby nie musiał pisać nazwy przodka. Zawsze można

procedure klasa3.jakas_metoda;
begin
  TKlasa1.metoda();
end;

przy czym metoda() powinna byc jako public

Przy czym jest to bez sensu. bo albo tworzysz klasę bazową i po niej wszystkie inne dziedziczą, albo dziedzisz po kolei, to co chcesz osiągnąć to takie GOTO.

0

nie da się wywołać metody wirtualnej!!

0

Mam taką sytuację, że jest gotowa klasa którą chciałbym nieco zmodyfikować. Chcąc uniknąć dłubania w istniejącym już kodzie wolałbym napisać klasę dziedzicząca po tej która już jest. To rozwiązanie wydaje mi się bardziej naturalne. Jednak napotykam na problem o którym pisałem w pierwszym poście - nie chcę wywoływac metody virtualnej bezpośredniego przodka ale przodka wyżej. Brak takiej możliwości oznacza, że musze jednak modyfikować istniejąca klasę zamiast tworzyć nową. To rozwiązanie moim zdaniem gorsze a co to ma wspólnego z GOTO to chyba pozostaje słodką tajemnica ADAMA_OLEKSEGO :)

0

Z racji, że byłem po nocce zapomniałem napisać, że trzeba zdjąć te deklaracje metod wirtualnych. Co do GOTO? GOTO=burdel, i takie dziwne wywoływanie klas też

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