Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Inherited "überspringen"? (https://www.delphipraxis.net/192045-inherited-ueberspringen.html)

jaenicke 16. Mär 2017 15:51

AW: Inherited "überspringen"?
 
Ich würde das lieber so sauber wie eben möglich ohne Assembler lösen:
Delphi-Quellcode:
uses
  System.Rtti, System.TypInfo;

procedure Unterklasse2.Proc;
begin
  System.Rtti.Invoke(@Oberklasse.Proc, TArray<TValue>.Create(TValue.From<Unterklasse2>(Self)), ccReg, nil);
end;

Ghostwalker 16. Mär 2017 18:11

AW: Inherited "überspringen"?
 
Außer den Möglichkeiten von Uwe und Jaenike hab ich keine weiteren gefunden.

Da du aber Unterklasse2 eh nur wegen eines Fehlers in Unterklasse1 baust, warum
leitest du das ganze nicht direkt von Oberklasse ab ? Dann kann Unterklasse1 über die
Klinge springen.

Rabenrecht 17. Mär 2017 12:36

AW: Inherited "überspringen"?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1364405)

Funktioniert das denn bei dir?

Ne...

Mein spezifisches Problem war anders lösbar, weil die Oberklasse.Proc nen Einzeiler mit nem Zugriff auf eine Published Property war (check auf Ereignisbehandlung) und ich das deshalb schmerzfrei nachbauen konnte.

Die Diskussion interessiert mich dennoch. Ähnliche Fälle werden in Zukunft wahrscheinlich nochmal auftreten.


Zitat:

Zitat von Ghostwalker (Beitrag 1364430)
Da du aber Unterklasse2 eh nur wegen eines Fehlers in Unterklasse1 baust, warum
leitest du das ganze nicht direkt von Oberklasse ab ? Dann kann Unterklasse1 über die
Klinge springen.

Weil im Unterschied zu meinem aufs Notwendigste reduzierte Beispiel im konkreten Fall Unterklasse1 eine ganze Menge notwendiger Funktionalität enthält :wink:

Zacherl 17. Mär 2017 13:28

AW: Inherited "überspringen"?
 
Noch eine Dritte Variante ohne Assembly oder RTTI:
Delphi-Quellcode:
{ TA }

procedure TA.X(I: Integer);
begin
  ShowMessage('1: ' + I.ToString);
end;

{ TB }

procedure TB.X(I: Integer);
begin
  inherited;
  ShowMessage('2: ' + I.ToString);
end;

{ TC }

procedure TC.X(I: Integer);
type
  TProc = procedure(Sender: TA; I: Integer);
begin
  //inherited;
  TProc(@TA.X)(Self, I);
  ShowMessage('3: ' + I.ToString);
end;

MichaelT 17. Mär 2017 17:19

AW: Inherited "überspringen"?
 
Nein. Solltest du meiden.

Es gibt in C++ diese Art des Aufrufs, mit dem wird aber im Falle von Multiple Inheritance zwischen den Base Classes unterschieden in erster Linie.

Gute Frage wäre ob du nicht einfach ein Objekt der entfernten Basisklasse erzeugst und das Ergebnis verwendest. Ob das Sinn macht sei dahingestellt.

Ich würde nicht ausschließen, ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:56 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz