![]() |
Abstrakte Methode mit Enum -> Unterschiedliche Definitionen
Liebe Kameraden,
Ich habe eine Vorfahrenklasse für eine Client-Server-Komponente erstellt. Von dieser leite ich dann weitere Komponenten entsprechend dem Einsatzzweck ab. Hierbei stoße ich auf folgendes Problem ( Der Einsatzweck der Komponente ist irrelevant, es geht um die abstrakte Methode ): Meine Vorfahrenklasse (auf das Nötigste reduziert ):
Delphi-Quellcode:
Das TSrvCmd ist in der o.g. Unit "uMKLANConstants" definiert:
unit uCustomClient;
interface uses [...], uMKLANConstants; TMKCustomClient = class(TComponent) [...] protected procedure DoOnServerCommand(ServerCommand : TSrvCmd; Data : TStream); virtual; abstract; // <- Um das "TSrvCmd" geht es [...] end;
Delphi-Quellcode:
So, nun möchte ich das Set TSrvCmd in der abgeleiteten Komponente (und NUR in dieser!) erweitern um die entsprechenden Funktionen zu implementieren, z.B.:
type
TSrvCmd = (Command1, Command2);
Delphi-Quellcode:
Jetzt meckert mir der Compiler, dass die Definitionen von DoOnServerCommand unterschiedlich sind. Mir ist absolut klar, dass es sich für den Compiler um zwei verschiedene "inkompatible" Sets handelt, da sie in verschiedenen Units deklariert wurden. Die Fehlerursache ist mir also klar, ABER wie kann ich das geplante umsetzen? Natürlich könnte ich in der o.g. Unit das Set "unendlich" erweitern, allerdings hätte ich dann bei vielen abgeleiteten Komponenten "unnötige" Einträge in TSrvCmd drin - und das möchte ich der Übersicht halber eben vermeiden.Type TSrvCmd = (Command1, Command2, Command3, Command4, Command5); TMKChatClient = class(TMKCustomClient) [...] protected procedure DoOnServerCommand(ServerCommand : TSrvCmd; Data : TStream); override; [...] end; |
AW: Abstrakte Methode mit Enum -> Unterschiedliche Definitionen
Das wird so leider nicht funktionieren, denn die Größe eines Sets hängt von der Anzahl der Elemente ab. Fügst du also Elemente hinzu, kann es sein, dass sich die Größe des Sets ändert.
Ich würde das über eine Klasse oder Interfaces regeln. Die kannst du dann ableiten, um weitere Einträge hinzuzufügen. |
AW: Abstrakte Methode mit Enum -> Unterschiedliche Definitionen
Zitat:
Schönes Wochenende schonmal und Danke für die schnelle Antwort :thumb: |
AW: Abstrakte Methode mit Enum -> Unterschiedliche Definitionen
Du könntest es auch über ein
Delphi-Quellcode:
regeln:
overload
Delphi-Quellcode:
type
TSrvCmd = (Command1, Command2); type TMKCustomClient = class protected procedure DoOnServerCommand(ServerCommand : TSrvCmd; Data : TStream); virtual; abstract; end; type TSrvCmd2 = (Command1a, Command2a, Command3, Command4, Command5); type TMKChatClient = class(TMKCustomClient) protected procedure DoOnServerCommand(ServerCommand : TSrvCmd; Data : TStream); override; overload; procedure DoOnServerCommand(ServerCommand : TSrvCmd2; Data : TStream); overload; end; procedure TMKChatClient.DoOnServerCommand(ServerCommand: TSrvCmd; Data: TStream); begin { hier setzen wir voraus, daß die Ordnungszahlen der ersten beiden Werte von TSrvCmd2 denen von TSrvCmd entsprechen } DoOnServerCommand(TSrvCmd2(ServerCommand), Data); end; procedure TMKChatClient.DoOnServerCommand(ServerCommand: TSrvCmd2; Data: TStream); begin case ServerCommand of Command1a: ; Command2a: ; Command3: ; Command4: ; Command5: ; end; end; |
AW: Abstrakte Methode mit Enum -> Unterschiedliche Definitionen
Besten Dank für eure Antworten! Die Sache mit dem Casten sieht interessant aus. Mich würde abschließend trotzdem noch interessieren wie es mit den Klassen aussehen würde :oops:
Nochmals danke für eure Hilfe und schönes Wochenende 8-) |
AW: Abstrakte Methode mit Enum -> Unterschiedliche Definitionen
Mit gleichnamigen Enums
Delphi-Quellcode:
oder ein Subset der Selben
{$SCOPEDENUMS ON}
type TSrvCmd1 = (Command1, Command2); TSrvCmd2 = (Command1, Command2, Command3, Command4, Command5); DoOnServerCommand(TSrvCmd1.Command1, xxx);
Delphi-Quellcode:
type
TSrvCmd2 = (Command1, Command2, Command3, Command4, Command5); TSrvCmd1 = Command1..Command2; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:00 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