AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Vererbung mit mehrfach eingeschränktem TypParamater
Thema durchsuchen
Ansicht
Themen-Optionen

Vererbung mit mehrfach eingeschränktem TypParamater

Ein Thema von Alexander I · begonnen am 16. Mai 2014 · letzter Beitrag vom 20. Mai 2014
Antwort Antwort
Seite 1 von 2  1 2      
Alexander I

Registriert seit: 16. Mai 2014
18 Beiträge
 
Delphi XE5 Starter
 
#1

Vererbung mit mehrfach eingeschränktem TypParamater

  Alt 16. Mai 2014, 10:43
Hallo,

ich möchte eine Klasse mit zweifach eingeschränktem TypParameter nach der Art TFoo<T: Interface1,Interface2> vererben.

Die Klasse0, ist die Klasse mit den zwei einschränkenden TypParametern.

An Klasse1 soll nun Klasse0 mit dem InterfaceTypParameter IKlasse1 vererbt werden.

Bekomme aber die Fehlermeldung
[dcc32 Fehler] : E2514 Typparameter 'T' muss Interface 'IKlasse2' unterstützen

Was ist falsch?


interface

type
IKlasse1 = interface;

IKlasse2 = interface;

Klasse0< T : IKlasse1, IKlasse2 > = class;

Klasse1 = class;

Klasse2 = class;



IKlasse1 = interface end;

IKlasse2 = interface end;

Klasse0< T : IKlasse1, IKlasse2 > = class(TInterfacedObject)

function Transform : T;

end;


Klasse1 = class( Klasse0< IKlasse1 > ) end; ===>> hier erfolgt die Fehlermeldung: Typparameter 'T' muss Interface 'IKlasse2' unterstützen

Klasse2 = class( Klasse0< IKlasse2 > ) end; ===>> hier erfolgt die Fehlermeldung: Typparameter 'T' muss Interface 'IKlasse1' unterstützen



implementation

end.




Gruß

Alexander
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Vererbung mit mehrfach eingeschränktem TypParamater

  Alt 16. Mai 2014, 11:07
Naja die Typeinschränkungen müssen halt beide erfüllt werden.

Klasse0< T : IKlasse1, IKlasse2 > = class; =>

T muss IKlasse1 UND IKlasse2 unterstützen. Nicht ODER.

Du solltest deinen Code übrigens mit Delphi-Tags versehen. Das machts etwas übersichtlicher!
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Vererbung mit mehrfach eingeschränktem TypParamater

  Alt 16. Mai 2014, 11:46
Und ohne die Forward-Deklarationen sieht der Code auch gleich viel übersichtlicher aus.
Delphi-Quellcode:
interface

type
  IKlasse1 = interface end;
  IKlasse2 = interface end;

  Klasse0<T: IKlasse1, IKlasse2> = class(TInterfacedObject)
    function Transform: T;
  end;

  Klasse1 = class(Klasse0<IKlasse1>) end;
  Klasse2 = class(Klasse0<IKlasse2>) end;

implementation

end.
Ich hätte zwar auch ODER gedacht, aber wenn das stimmt, dann kannst du das vielleicht über eine Interfacevererbung lösen:
Delphi-Quellcode:
type
  IBasisKlasse = interface end;
  IKlasse1 = interface(IBasisKlasse) end;
  IKlasse2 = interface(IBasisKlasse) end;

  Klasse0<T: IBasisKlasse> = class(TInterfacedObject) // oder Klasse0<T: IBasisKlasse> = class(TInterfacedObject, IBasisKlasse)
    function Transform: T;
  end;

  Klasse1 = class(Klasse0<IKlasse1>) end;
  Klasse2 = class(Klasse0<IKlasse2>) end;
Oder du schränkst es nicht all zu sehr ein:
Delphi-Quellcode:
type
  IKlasse1 = interface end;
  IKlasse2 = interface end;

  Klasse0<T: interface> = class(TInterfacedObject)
    function Transform: T;
  end;

  Klasse1 = class(Klasse0<IKlasse1>) end;
  Klasse2 = class(Klasse0<IKlasse2>) end;
[edit]
Ich mein natürlich IKlasse0, statt IBasisKlasse
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (16. Mai 2014 um 11:51 Uhr)
  Mit Zitat antworten Zitat
Alexander I

Registriert seit: 16. Mai 2014
18 Beiträge
 
Delphi XE5 Starter
 
#4

AW: Vererbung mit mehrfach eingeschränktem TypParamater

  Alt 16. Mai 2014, 16:29
Danke für die schnellen Antworten.

Ich hatte gedacht, gehofft das man sagen kann das für T entweder die eine oder andere IKlasse gilt.


Probiert hatte ich auch

IKlasse1 = interface(IUnknown) end;

IKlasse2 = interface(IUnknown) end;

Klasse0<T : IKlasse1, IKlasse2> = class(TInterfacedObject)

function Transform : T;

end;


Klasse1 = class( Klasse0< IKlasse1 , IKlasse2> ) end;


mit FehlerMeldung [dcc32 Fehler] E2003 Undeklarierter Bezeichner: 'Klasse0<,>'

jetzt hätte ich gedacht das beide IKlassen angenommen werden.

Gruß
Alexander
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.045 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#5

AW: Vererbung mit mehrfach eingeschränktem TypParamater

  Alt 16. Mai 2014, 17:28
Einschränkungen für Typparameter können kein "oder". Alles was du hinter dem ":" angibst, muss restlos erfüllt sein.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Vererbung mit mehrfach eingeschränktem TypParamater

  Alt 16. Mai 2014, 18:55
Aso, deswegen heißt es also
E2553 Klassentypeinschränkung darf nicht mehr als einmal angegeben werden
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Alexander I

Registriert seit: 16. Mai 2014
18 Beiträge
 
Delphi XE5 Starter
 
#7

AW: Vererbung mit mehrfach eingeschränktem TypParamater

  Alt 20. Mai 2014, 09:43
Danke für die Tips.

Mich stört das ich eine Klasse haben muß, in der beide Interfaces auch noch implementiert werden müßen.
TKlasse = class( TInterfacedObject, IKlasse1, IKlasse2 ) .
Das wollte ich aber vermeiden.

Ich möchte in TKlasse1 nicht auf IKlasse2 zugreifen können. Was man machen könnte wäre
  TKlasse1 = class( TKlasse0<TKlasse> , IKlasse1 ) end; .
Dann hätte ich aber doppelten Code, auch wenn ich in TKlasse virtual und abstract auf die Methoden von IKlasse1 lege.


Nichts desto trotz, mein Ziel wäre gewesen in
Delphi-Quellcode:
Klasse0<T : IKlasse1, IKlasse2> = class(TInterfacedObject)
function Transform(element : T) : T;
end;
auf die Methoden und Eigenschaften von element zugriefen zu können (element.Eigenschaft1) . Aber das geht leider nicht.

Oder doch?

Gruß und Danke

Alexander
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.196 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Vererbung mit mehrfach eingeschränktem TypParamater

  Alt 20. Mai 2014, 10:10
Ich komme nicht ganz hinterher, was letztendlich dein Ziel ist.

Du hast zwei vollkommen verschiedene Interfaces. Eine Klasse soll jetzt entweder mit IMeinInterface1 ODER IMeinInterface2 parametrisiert werden können. Typeinschränkungen sind immer UND.

Entweder es macht Sinn und du bildest ein gemeinsames Über-Interface (welches fortan die einzige Parametrisierungs-Einschränkung ist)
Delphi-Quellcode:
type
   IMyBaseInterface = interface
      // ?
   end;

   IMyInterface1 = interface(IMyBaseInterface)
      // ?
   end;

   IMyInterface2 = interface(IMyBaseInterface)
      // ?
   end;

   TMeineGenerischeKlasse<T: IMyBaseInterface> = class

   end;
Oder es ist sicher dass es immer bei diesen beiden Interfaces bleiben wird. Dann würde ich die Klasse überhaupt nicht generisch machen sondern halt zwei verschiedene Methoden anbieten- Einmal für IMyInterface1 und einmal für IMyInterface2 .


Vielleicht liegt es an mir, aber ich persönlich habe immer große Schwierigkeiten mit vollkommen abstrakten Bezeichnern wie TKlasse1 = class( TKlasse0<TKlasse> , IKlasse1 ) end; . Kannst du vlt. ein ganz konkretes Beispiel geben? Kann ja frei erfunden sein, aber irgendwas zum "Anfassen"...
  Mit Zitat antworten Zitat
Dejan Vu
(Gast)

n/a Beiträge
 
#9

AW: Vererbung mit mehrfach eingeschränktem TypParamater

  Alt 20. Mai 2014, 11:57
Mich stört das ich eine Klasse haben muß, in der beide Interfaces auch noch implementiert werden müßen.
Das geht doch gar nicht anders. Woher willst Du denn wissen, ob Du auf Property-A vom IKlasse1 zugreifen kannst, wenn deine Klasse dieses Interface gar nicht implementiert...

Mir scheint, deine OOP-Überlegungen bedürfen einer gründlicher Überarbeitung.
Ich komme nicht ganz hinterher, was letztendlich dein Ziel ist.
...aber ich weiß nicht, ob es das ist, was du willst...
Dem schließe ich mich an.
  Mit Zitat antworten Zitat
Alexander I

Registriert seit: 16. Mai 2014
18 Beiträge
 
Delphi XE5 Starter
 
#10

AW: Vererbung mit mehrfach eingeschränktem TypParamater

  Alt 20. Mai 2014, 12:24
Ich hab mal ein pdf erstellt, in dem "ersichtlich" ist wie ich mir das gedacht habe.

Es gibt zwei verschiedene Klassen: Punkte und Vektoren.

Dies erben von einer "abstrakten" BaseTransformationsKlasse die nix kann außer eine Instanz der TranslateKlasse in ihrer eigenen Methode BaseTransformations.Translate zu

instanziieren.

Die TranslateKlasse soll aber von Anfang an wissen welchem Typ sie erwarten soll, damit ich auf die Propertys zugreifen kann, nämlich element.X.

In C# gibts sowas mit where T : .... und da kann man auf Methoden und Propertys sofort zugreifen.


Gruß
Alexander
Angehängte Dateien
Dateityp: pdf Vererbung mit mehrfach eingeschränktem TypParamater.pdf (6,0 KB, 10x aufgerufen)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 15:32 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