Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   .NET-Framework (managed code) (https://www.delphipraxis.net/79-net-framework-managed-code/)
-   -   Generics: alle mit Base Type verwenden (https://www.delphipraxis.net/157052-generics-alle-mit-base-type-verwenden.html)

xaromz 27. Dez 2010 09:22

Generics: alle mit Base Type verwenden
 
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

himitsu 27. Dez 2010 09:46

AW: Generics: alle mit Base Type verwenden
 
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.

Khabarakh 27. Dez 2010 13:53

AW: Generics: alle mit Base Type verwenden
 
Zitat:

Zitat von xaromz (Beitrag 1070574)
In Java gibt es ein
Code:
if (x is IGeneric<?>)

Das ist kein Feature, das ist Type Erasure :mrgreen: . 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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 10: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