Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Methoden in mehreren Klassen benutzen... (https://www.delphipraxis.net/63972-methoden-mehreren-klassen-benutzen.html)

Pseudemys Nelsoni 25. Feb 2006 14:26


Methoden in mehreren Klassen benutzen...
 
Moin,

mein "Problem" ist schwer zu beschreiben, deswegen versuche ich mal per Code zu erklären wo meine Frage liegt.

Nehmen wir einmal an ich habe folgende Hauptklasse:

Delphi-Quellcode:
TIRCClient = class
private
  FClient: TClientSocket;
public
  procedure Message(const Channel, Message: string);
end;

...

procedure TMainClass.Message(const Channel, Message: string);
begin
  FClientSocket.SendText(Format('PRIVMSG %s :%s%s', [Channel, Message, #13#10]));
end;
Diese Beispiel-Methode schreibt eine Message in einen Channel eines IRC Servers...

So, jetzt gibt es noch eine Subklasse die folgendermaßen aussieht:

Delphi-Quellcode:
TUser = class
private
  FOwner: TIRCClient;
  FChannel: string;
public
  procedure Message(const Message: string);
end;

...

procedure TUser.Message(const Message: string);
begin
  FOwner.Message(FChannel, Message);
end;


Da ist das "Problem".... ist es wirklich nötig, Funktionen in einer Subklasse zu haben die eigentlich nichts tun, bis auf eine Methode des Vorgängers aufzurufen? Bei 100 Methoden (z.B) ist es ziemlich nervig wenn man dann solchen Code hier hat:

Delphi-Quellcode:
procedure TUser.Proc1(const Message: string);
begin
  FOwner.Proc(FChannel, Message);
end;

procedure TUser.Proc2(const Message: string);
begin
  FOwner.Proc2(FChannel, Message);
end;

procedure TUser.Proc3(const Message: string);
begin
  FOwner.Proc3(FChannel, Message);
end;
Und das nur, weil die Menge der Parameter vielleicht unterschiedlich ist...

Ich hoffe es ist zu verstehen was ich meine..sonst erklär ich gern nochmal *g*

leddl 25. Feb 2006 14:35

Re: Methoden in mehreren Klassen benutzen...
 
:gruebel: Naja, was willst du denn machen? Wenn du in den unterschiedlichen Methoden nunmal unterschiedliche Parameter hast, bleibt dir eben nichts anderes übrig, als deiner Klasse zu sagen, was sie damit machen soll :roll:

Der_Unwissende 25. Feb 2006 15:54

Re: Methoden in mehreren Klassen benutzen...
 
Hi,
du solltest wirklich noch mal genauer sagen was du wie machen möchtest.
Aber es gibt eigentlich mehrere Ansätze, was alles möglich ist. Natürlich stellt sich als Erstes mal die Frage, wie unterschiedlich die Parameter sind.
Wenn du zwei (oder mehr) Klassen hast, die eine gemeinsame Methode besitzen (macht das gleiche und hat die gleiche Anzahl der Parameter), dann kannst du sehr einfach mit einer Basisklasse arbeiten. Diese beinhaltet dann natürlich die implementierung aller gemeinsamer Methoden.

Anders sieht es natürlich aus, wenn du zwei (oder mehr) Klassen hast, die im Prinzip die gleiche Methode besitzen, aber unterschiedlich viele Parameter haben. Hier kannst du mit dem Adapterpattern arbeiten. Du wandelst eigentlich inkompatible Eingaben einfach so um, dass sie verwendet werden können. Ok, soweit ist's klar, einfach umwandeln *hüstel*
Wenn es möglich ist (hängt stark von deinem Problem ab), kannst du einfach optionale Parameter einführen, die einen Standardwert haben

Delphi-Quellcode:
procedure sendMessage(Message : String; optionalerParameter : TIrgendwas = nil);
....
....

sendMessage('Mit nur einem Parameter benutzt (optionalerParameter ist also nil)');
sendMessage('Mit zwei Parameter benutzt', InstanzVonTIrgendwas);
Wie gesagt, hängt doch eher von deinem konkreten Fall ab.

Gruß Der Unwissende

Luckie 25. Feb 2006 16:00

Re: Methoden in mehreren Klassen benutzen...
 
So lange die Klassen in einer Unit sind, sind es Friends, das heißt, du kannst auch Methoden aus anderen Klassen in der Unit aufrufen.

Elvis 25. Feb 2006 16:18

Re: Methoden in mehreren Klassen benutzen...
 
Zitat:

Zitat von Pseudemys Nelsoni
Da ist das "Problem".... ist es wirklich nötig, Funktionen in einer Subklasse zu haben die eigentlich nichts tun, bis auf eine Methode des Vorgängers aufzurufen?

Du rufst nicht die Methoden des Vorgängers auf. Das was fOwner bei dir ist, nennt sich ein Aggregat. ;)
Ich hatte die in deinem anderen Thread [1] gezeigt, wie du Interface delegation benutzen kannst, um solche "Durchschleif calls" vom Compiler erledigen zu lassen.
Das klappt aber nur wenn die Methoden die gleiche Signatur haben. Also klappt es bei dir hier nicht.
Zitat:

Bei 100 Methoden (z.B) ist es ziemlich nervig wenn man dann solchen Code hier hat:
Bei 100 Methoden sieht mir das schon fast nach einer Designschwäche aus. ;)

Du hast angeboten das Ganze etwas ausführlicher zu erklären. Ich glaube, das wäre eine gute Idee, sonst wird man dir nicht wirklich weiterhelfen können.


btw: Methoden nach Substantiven zu benennen ist ganz böse.
Vor allem wenn es in der vorherrschenden Klassenbibliothek ein "SendText" gibt halte ich ein plötzliches "Message" nicht nur unangebracht, weil es nicht nach einer Aktion benannt ist...

[1] Dort muss, in meinem Schnipsel, im BeforeDestruction das inherited an den Schluss der Methode... :oops:


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:59 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