Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Methoden - "Vererbung" (https://www.delphipraxis.net/144753-methoden-vererbung.html)

Neutral General 15. Dez 2009 20:51


Methoden - "Vererbung"
 
Hi,

Also man kann ja einfach Methoden überschreiben etc...
Bin mir eigentlich recht sicher, dass das was ich vorhabe NICHT geht aber ich frage nochmal nach obs da irgendwas gibt, bzw ob man da was basteln/improvisieren könnte...

Angenommen ich habe eine Klasse mit einer Methode "Auto" und eine Nachfolgerklasse hat die Methoden "VW", "Audi", "BMW" und "Mercedes". Alle Methoden sollen quasi von "Auto" erben, also es soll bei jeder Methode am Anfang der Code von "Auto" ausgeführt werden. Geht das? Naja gut es ginge so:

Delphi-Quellcode:
TAuto = class
  procedure Test; virtual;
end;

TAuto2 = class(TAuto)
  procedure VW;
  procedure Audi;
end;

procedure TAuto2.VW;
begin
  inherited Test;
end;

procedure TAuto2.Audi;
begin
  inherited Test;
end;
Aber das ist irgendwie nicht was ich suche...
Ja ich weiß.. Blöd wenn man selbst nicht weiß was man sucht/will :mrgreen:

Aber vielleicht hat jmd eine besonders gute Glaskugel und kann mir trotzdem helfen :glaskugel: :stupid:

Edit: Ich will quasi dass inherited Test automatisch aufgerufen wird, ohne dass in der Methode selbst nochmal aufrufen zu müssen.

Sagen wir mal sowas wie:

Delphi-Quellcode:
TAuto2 = class(TAuto)
  procedure VW; inherits from Test;
  procedure Audi; inherits from Test;
end;
:freak:


Gruß
Neutral General

Medium 15. Dez 2009 22:04

Re: Methoden - "Vererbung"
 
Du kommst echt immer auf seltsame Ideen :gruebel: :)

Ich kann mir erstmal nicht vorstellen dass sich sowas hinbügeln lässt - zumindest nicht im Rahmen reiner theoretischer OOP - aber auch mit Tricksen und Hacksen kann ich mir im Moment nicht wirklich was vorstellen.

sx2008 16. Dez 2009 05:23

Re: Methoden - "Vererbung"
 
Glasskugel dreh...du sucht das Strategie Design Pattern.

Neutral General 16. Dez 2009 16:55

Re: Methoden - "Vererbung"
 
Zitat:

Zitat von sx2008
Glasskugel dreh...du sucht das Strategie Design Pattern.

Ist das nicht einfach nur Polymorphie?

Ich will ja sowas:

Delphi-Quellcode:
TBase = class
  procedure BaseProc;
end;

TAbleitung = class(TBase)
   procedure Blubb; of BaseProc; // oder so :-D
   procedure Foo; of BaseProc;
end;

procedure TBase.BaseProc;
begin
  ShowMessage('Base');
end;

procedure TAbleitung.Blubb;
begin
  ShowMessage('Blubb');
end;

procedure TAbleitung.Foo;
begin
  ShowMessage('Foo');
end;
Jetzt soll wenn man TAbleitung.Blubb; aufruft erst BaseProc aufgerufen werden und dann Blubb selbst.
Bei procedure TAbleitung.Foo das gleiche Prinzip. Erst BaseProc, dann Foo.

Namenloser 16. Dez 2009 17:01

Re: Methoden - "Vererbung"
 
Du wirst wohl um ein inherited nicht herumkommen. Wozu auch? Ist doch viel sinnvoller, wenn du bestimmen kannst, WANN die Methode aufgerufen werden soll. Oft ist es ja nötig, vor dem Aufruf noch Daten zu verändern oder anschließend aufzuräumen.

Eventuell wäre es gut, wenn du mal erläutern könntest, was du eigentlich konkret vorhast.

Neutral General 16. Dez 2009 17:06

Re: Methoden - "Vererbung"
 
Hi,

Generell hast du recht.. Naja es geht um das gleiche Problem, was ich schonmal hier auf eine andere Weise lösen wollte.
Es geht darum Änderungen von Properties eines Objekts mitzubekommen und darauf reagieren zu können.

Bedingungen:
- es muss eine Set-Methode für die jeweilige Property existieren
- ... Wobei es genial wäre, wenn nichtmal das nötig wäre :!:
- Der Nutzer dieses Features soll seine eigene Klasse möglichst wenig anpassen müssen.
D.h. er bestimmt, dass seine Klasse TFoo überwacht werden soll und muss dazu IM IDEALFALL nichts an TFoo ändern/anpassen.
1 oder 2 kleine Änderungen wären noch OK.

Aber es wäre halt nervig wenn er in jede Set-Methode daran denken müsste inherited BlaBla; aufzurufen. Wenn ers vergisst, funktionierts mit der Property nicht und er wundert sich warums nicht geht.

Verstanden was ich will?

Namenloser 16. Dez 2009 17:36

Re: Methoden - "Vererbung"
 
Zitat:

Zitat von Neutral General
Verstanden was ich will?

Ja, verstanden, glaub ich. Hmm, also ich fürchte, dass das nicht wirklich machbar ist. Allerdings kannst du dir unter Umständen das Delphi-Konstrukt Delphi-Referenz durchsuchenindex zu Nutze machen:
Delphi-Quellcode:
type
  TBaseClass = class
  private
    FFields: array of integer;
  protected
    function GetField(Index: integer);
    procedure SetField(Index: integer; Value: integer);
    procedure SetFieldCount(Count: integer);
  end;

  TDerivedClass = class(TBaseClass)
  public
    property Value1: integer index 0 read GetField write SetField;
    property Value2: integer index 1 read GetField write SetField;
    property Value3: integer index 2 read GetField write SetField;
    constructor Create;
  end;

implementation

function TBaseClass.GetField(Index: integer);
begin
  Result := FFields[Index];
end;

procedure TBaseClass.SetField(Index: integer; Value: integer);
begin
  FFields[Index] := Value;
end;

procedure TBaseClass.SetFieldCount(Count: integer);
begin
  SetLength(FFields, Count);
end;

constructor TDerivedClass.Create;
begin
  SetFieldCount(3);
end;

sx2008 19. Dez 2009 11:40

Re: Methoden - "Vererbung"
 
Jetzt hab ich verstanden, was du eigentlich erreichen möchtest.
Du hast eine x-beliebige Klasse, die nicht verändert werden soll.
Dann möchtest du dich von Aussen an bestimmte Methoden und/oder Properties einhaken und
das Verhalten verändern.
http://upload.wikimedia.org/wikipedi...rammierung.png
Du könntest dann vor und nach dem Methodenaufruf zusätzliche Dinge ausführen, von denen die orginal Klasse nichts weiss.
In dem Bild steckt das in dem roten Kreis.
Mit dieser Technik des Abfangens von Methodenaufrufen könntest du Dinge tun, an die der Programmierer der Klasse nicht gedacht hat.
Man nennt das Aspektorientierte Programmierung.
Leider ist Delphi (wie auch die meisten anderen Prog.Sprachen) dazu noch nicht in der Lage.

Neutral General 18. Jan 2010 10:59

Re: Methoden - "Vererbung"
 
Zitat:

Zitat von sx2008
Man nennt das Aspektorientierte Programmierung.
Leider ist Delphi (wie auch die meisten anderen Prog.Sprachen) dazu noch nicht in der Lage.

Meinst du, es könnte irgendwie möglich sein, dass selbst nachzurüsten?


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:38 Uhr.

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