AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Generics: alle mit Base Type verwenden

Ein Thema von xaromz · begonnen am 27. Dez 2010 · letzter Beitrag vom 27. Dez 2010
Antwort Antwort
xaromz

Registriert seit: 18. Mär 2005
1.682 Beiträge
 
Delphi 2006 Enterprise
 
#1

Generics: alle mit Base Type verwenden

  Alt 27. Dez 2010, 10:22
Hallo,

ich habe folgendes Problem:
Ich habe mehrere Objekte, die ein generisches Interface implementieren, und möchte jeweils eine generische Eigenschaft dieser Objekte verwenden, und zwar unabhängig vom jeweiligen Typ. Ich erklär das mal mit etwas Code:
Code:
 interface IBase;
interface IDerived : IBase;

interface IGeneric<T> where T: IBase;
Ich habe also eine Eigenschaft von IGeneric<T> und möchte diese nun nutzen, und zwar unabhängig, ob es ein IGeneric<IBase> ist, oder ein IGeneric<IDerived>, da ich nur die Eigenschaften von IBase benötige. Ein
Code:
if (x is IGeneric<IBase>)
schlägt aber natürlich bei IDerived fehl. In Java gibt es ein
Code:
if (x is IGeneric<?>)
aber das gibt es wohl in C# nicht.
Ich hoffe, jemand konnte mit folgen.

Gruß
xaromz
I am a leaf on the wind - watch how I soar
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Generics: alle mit Base Type verwenden

  Alt 27. Dez 2010, 10:46
sowas geht nicht

Deine generischen Klassen haben als Vorfahre die Generics und nicht die gekapselten Interfaces.


Die Vererbungssachen kann man vor dem Generic komplett vergessen,
auch sind Generigs nicht untereinander kompatibel, selbst wenn sie einen kompatiblen Typen kapseln.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#3

AW: Generics: alle mit Base Type verwenden

  Alt 27. Dez 2010, 14:53
In Java gibt es ein
Code:
if (x is IGeneric<?>)
Das ist kein Feature, das ist Type Erasure . Dank der sind Typsicherheit und Generics zwei unvereinbare Dinge. C# bietet ab 4.0 dagegen über Ko-/Kontravarianz einen vernünftigen Weg an:
Code:
   class Base { }
   class Derived : Base { }
   interface IGeneric<out T>
      where T : Base
   {
      T Foo { get; }
   }

...

         IGeneric<Derived> a = ...;
         Console.WriteLine(a is IGeneric<Base>); // True
         var b = (IGeneric<Base>)a;
Sebastian
Moderator in der EE
  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 14:53 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