AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Abstrakte Methode mit Enum -> Unterschiedliche Definitionen
Thema durchsuchen
Ansicht
Themen-Optionen

Abstrakte Methode mit Enum -> Unterschiedliche Definitionen

Ein Thema von scrat1979 · begonnen am 17. Jun 2017 · letzter Beitrag vom 18. Jun 2017
Antwort Antwort
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#1

Abstrakte Methode mit Enum -> Unterschiedliche Definitionen

  Alt 17. Jun 2017, 13:15
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:
unit uCustomClient;

interface

uses [...], uMKLANConstants;

TMKCustomClient = class(TComponent)
  [...]
  protected
    procedure DoOnServerCommand(ServerCommand : TSrvCmd; Data : TStream); virtual; abstract; // <- Um das "TSrvCmd" geht es
  [...]
end;
Das TSrvCmd ist in der o.g. Unit "uMKLANConstants" definiert:

Delphi-Quellcode:
type
  TSrvCmd = (Command1, Command2);
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.:

Delphi-Quellcode:

Type TSrvCmd = (Command1, Command2, Command3, Command4, Command5);

TMKChatClient = class(TMKCustomClient)
  [...]
  protected
    procedure DoOnServerCommand(ServerCommand : TSrvCmd; Data : TStream); override;
  [...]
end;
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.
Michael Kübler
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Abstrakte Methode mit Enum -> Unterschiedliche Definitionen

  Alt 17. Jun 2017, 14:12
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Abstrakte Methode mit Enum -> Unterschiedliche Definitionen

  Alt 17. Jun 2017, 14:30
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.
Ich habe es befürchtet. Könntest Du mir ein kleines Beispiel geben wie ich das über Klassen lösen soll? Ist mir gerade nicht wirklich klar. Sollte es zu kompliziert sein, dann werde ich es über Konstanten lösen und den Typ SrvCmd auf Integer ändern

Schönes Wochenende schonmal und Danke für die schnelle Antwort
Michael Kübler
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#4

AW: Abstrakte Methode mit Enum -> Unterschiedliche Definitionen

  Alt 17. Jun 2017, 17:05
Du könntest es auch über ein overload regeln:

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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von scrat1979
scrat1979

Registriert seit: 12. Jan 2007
Ort: Sulzbach a.d. Murr
1.029 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Abstrakte Methode mit Enum -> Unterschiedliche Definitionen

  Alt 18. Jun 2017, 09:00
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

Nochmals danke für eure Hilfe und schönes Wochenende
Michael Kübler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Abstrakte Methode mit Enum -> Unterschiedliche Definitionen

  Alt 18. Jun 2017, 09:18
Mit gleichnamigen Enums
Delphi-Quellcode:
{$SCOPEDENUMS ON}

type
  TSrvCmd1 = (Command1, Command2);
  TSrvCmd2 = (Command1, Command2, Command3, Command4, Command5);

DoOnServerCommand(TSrvCmd1.Command1, xxx);
oder ein Subset der Selben
Delphi-Quellcode:
type
  TSrvCmd2 = (Command1, Command2, Command3, Command4, Command5);
  TSrvCmd1 = Command1..Command2;
$2B or not $2B

Geändert von himitsu (18. Jun 2017 um 09:26 Uhr)
  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 16:28 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