![]() |
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:
Diese Beispiel-Methode schreibt eine Message in einen Channel eines IRC Servers...
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; 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:
Und das nur, weil die Menge der Parameter vielleicht unterschiedlich ist...
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; Ich hoffe es ist zu verstehen was ich meine..sonst erklär ich gern nochmal *g* |
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:
|
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:
Wie gesagt, hängt doch eher von deinem konkreten Fall ab.
procedure sendMessage(Message : String; optionalerParameter : TIrgendwas = nil);
.... .... sendMessage('Mit nur einem Parameter benutzt (optionalerParameter ist also nil)'); sendMessage('Mit zwei Parameter benutzt', InstanzVonTIrgendwas); Gruß Der Unwissende |
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.
|
Re: Methoden in mehreren Klassen benutzen...
Zitat:
Ich hatte die in ![]() Das klappt aber nur wenn die Methoden die gleiche Signatur haben. Also klappt es bei dir hier nicht. Zitat:
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 09:45 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