AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Objektorientierung / Bestehende Komponente erweitern
Thema durchsuchen
Ansicht
Themen-Optionen

Objektorientierung / Bestehende Komponente erweitern

Ein Thema von MarioM. · begonnen am 28. Okt 2009 · letzter Beitrag vom 29. Okt 2009
Antwort Antwort
MarioM.

Registriert seit: 29. Mai 2006
52 Beiträge
 
#1

Objektorientierung / Bestehende Komponente erweitern

  Alt 28. Okt 2009, 19:42
Hallo,

ich habe eine Komponente, die ich gerne erweitern möchte.
Ich verfüge über den Quelltext der Komponente.

Damit ich nicht jedesmal alles neu machen muss, wenn die Fremdkomponente aktualisiert wird, möchte ich das nicht direkt im Code der Komponente machen, sondern eine eigene davon ableiten.

Dazu benötigt meine neue Klasse ein zusätzliches Feld.
Das Problem ist nun, dass ich eine Funktion (keine Methode!) ändern muss, die sich außerhalb der Klasse befindet.
Diese Funktion soll auf das neue Feld zugreifen.

Mit einer einfachen Ableitung ist ja nun nicht, da die Funktion nicht zu der Basisklasse gehört.

Wie macht man das nun?
  Mit Zitat antworten Zitat
Teekeks

Registriert seit: 19. Okt 2008
Ort: Dresden
765 Beiträge
 
FreePascal / Lazarus
 
#2

Re: Objektorientierung / Bestehende Komponente erweitern

  Alt 28. Okt 2009, 19:48
Wie meinst du das?
Einfach ableiten mittels:
Delphi-Quellcode:
type
  TMeineKlasse=class(TAbleitung)
  {...}
  end;
geht nicht?
Warum?

Gruß Teekeks
OMG! Ich habs tatsächlich mal geschafft als erster zu antworten!
Peter
"Div by zero Error" oder auch: "Es geht auch ohne Signatur!".
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#3

Re: Objektorientierung / Bestehende Komponente erweitern

  Alt 28. Okt 2009, 19:49
Kannst Du mal ein Beispiel posten? Im Moment steig ich noch nicht ganz durch.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
MarioM.

Registriert seit: 29. Mai 2006
52 Beiträge
 
#4

Re: Objektorientierung / Bestehende Komponente erweitern

  Alt 28. Okt 2009, 20:13
Also,

Ausgangssituation ist eine von mir lizenzierte Komponentensammlung.
Alle Klassen stehen in einer Unit.
Mehrere Klassen greifen nun auf eine bestimmte Funktion zu. Diese gehört aber nicht zu einer Klasse, sondern steht 'global' in der Unit.

Von einer dieser Klassen möchte ich nun eine Ableitung erstellen.
Der Grund für die Ableitung ist das Hinzufügen einer zusätzlichen Eigenschaft zu der neuen Klasse.
Diese Eigenschaft soll dann in der oben genannten ('globalen') Funktion benutzt werden.

Durch eine Ableitung der Klasse kann ich der neuen nun eine neue Eigenschaft verpassen.

Aber wie mache ich es denn mit der 'globalen' Funktion? Die muss ich ja auch ändern - ableiten geht aber nicht, da sie ja nicht zu der Klasse gehört. Genügt es da, diese Funktion 'global' in der Unit der abgeleiteten Klasse zu deklarieren?

Delphi-Quellcode:
unit Unit2;

interface

type
   //Klasse nutzt GlobaleFunktion
   TKlasse_Alt_1 = class

   end;

   //Klasse nutzt GlobaleFunktion
   TKlasse_Alt_2 = class

   end;

   //Klasse nutzt GlobaleFunktion
   TKlasse_Alt_3 = class

   end;

   //Wird von Klasse 1 abgeleitet
   TKlasse_Neu = class(TKlasse_Alt_1)
   private
      fNewProperty: string;
      procedure SetNewProperty(const Value: string);
   protected
      property NewProperty: string read FNewProperty write SetNewProperty;
   end;

//Besagte Funktion, die von allen Klassen benutzt wird
//Da sie auch die neue Eigenschaft aus Klasse_Neu benutzten soll, muss ich sie verändern; aber nicht in der Originalunit
function GlobaleFunktion: string;

implementation

function GlobaleFunktion: string;
begin

end;

{ TKlasse_Neu }

procedure TKlasse_Neu.SetNewProperty(const Value: string);
begin
   FNewProperty := Value;
end;

end.
Wichtig:
Die Ableitung muss in einer anderen Unit stehen!
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#5

Re: Objektorientierung / Bestehende Komponente erweitern

  Alt 28. Okt 2009, 20:20
Du könntest die Funktion ja in der Ableitungsunit erneut implementieren und darin dann das Original ausführen.
Delphi-Quellcode:
unit NeueUnit;

uses OriginalUnit,...;

function GlobaleFunktion: string;
begin
  Result := OriginalUnit.GlobaleFunktion + 'Neu';
end;
Aber ohne Insiderwissen kann ich da nicht mehr dazu sagen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
MarioM.

Registriert seit: 29. Mai 2006
52 Beiträge
 
#6

Re: Objektorientierung / Bestehende Komponente erweitern

  Alt 28. Okt 2009, 21:05
Ja, ist ein bissel schwierig mit dem Beispiel, da ich den Code aus lizenztechnischen Gründen nicht veröffentlichen darf.
Ich probiere Deinen Vorschlag mal aus - schonmal vielen Dank
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#7

Re: Objektorientierung / Bestehende Komponente erweitern

  Alt 29. Okt 2009, 08:23
Für das beschriebene Problem hat nichts mit Klassen zu tun.
Es geht schlicht darum eine Funktion zu anzupassen, ohne deren Quelltext zu verändern.
Dafür gibt es keine saubere Lösung.
Man könnte die Funktion aber zu Laufzeit patchen:
- Adresse der alten Funktion ermitteln
- Zugriffsrechte zum verändern des entsprechenden Speicherbereichs setzen
- an der Adresse der alten Funktion einen Sprung direkt zu der Adresse der neuen Funktion schreiben
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

Re: Objektorientierung / Bestehende Komponente erweitern

  Alt 29. Okt 2009, 08:49
Zitat von Blup:
- an der Adresse der alten Funktion einen Sprung direkt zu der Adresse der neuen Funktion schreiben
Wenn er die alte Funktion aber dennoch ausführen will (nur halt mit 'ner kleinen Erweiterung der Parameter, bzw. des Rückgabewertes), dann gibt es hier ein kleines Problem.

Denn es wird dann vermutlich diese Funktion direkt angesprungen und nicht über 'ne "Adresstabelle", so wie z.B. bei den WinAPIs.
Wenn er dort also eine Umleitung zu seiner eigenen Funktion einfügen würde, dann würden wohl die ersten Bytes der Funktion überschrieben.


Aber um das abzuklären, wären mal ein paar mehr und vorallem genauere/detailiertere Informationen nötig.
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:03 Uhr.
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