Generika mit dem Generischen Parameter und Abstrakte Klasse,

Habe ich zwei generische Basis-Klassen. Die zweite generische Klasse ist eine Einschränkung auf die parameter der ersten Klasse.

abstract class FirstClass<T> {...}

abstract class SecondClass<U> where U : FirstClass {...}

Funktioniert das nicht, weil FirstClass ist nicht definiert. Also muss ich dies tun.

abstract class FirstClass<T> {...}

abstract class SecondClass<U, T> where U : FirstClass<T> {...}

Die funktioniert. Jedoch, dies macht die Umsetzung dieser abstrakten Klassen hässlich.

class SomeClass {...}

class MyFirstClass : FirstClass<SomeClass> {...}

class MySecondClass : SecondClass<MyFirstClass, SomeClass> {...}

Dieser scheint überflüssig für mich, weil ich die Angabe SomeClass zweimal. Gibt es eine Möglichkeit, es zu erklären in der Weise, dass T von der FirstClass wird automatisch die U für SecondClass. Was würde ich wirklich wie dieser Aussehen wird.

class SomeClass {...}

class MyFirstClass : FirstClass<SomeClass> {...}

class MySecondClass : SecondClass<MyFirstClass> {...}

Bezweifele ich genau dieses Szenario möglich ist, ist es ein sauberer, was zu tun ist, was ich versuche zu tun?

Bearbeiten

Einige Leute haben vorgeschlagen, eine IFirstClass-Schnittstelle. Aber meine Definitionen sind näher an diesem.

class FirstClass<T>
{
    public T MyObj { get; set; }
}

class SecondClass<U, T> where U : FirstClass<T>
{
    U MyFirstClass { get; set; }
}

Mit einer Schnittstelle ich kann nicht auf MyFirstClass.MyObj von SecondClass. Während ich erstellen Sie eine object T MyObj { get; set; } auf IFirstClass, dann verwenden Sie new es zu verbergen, silverlight wirft eine Passform in der Bindung, wenn ich dies tun.

Während ich nicht erwähnen silverlight in Frage, dies ist ein silverlight-Projekt. Ich bin mir nicht sicher, ob dies einschränken würde, die Lösung.
Es würde beschränken die Lösung, wenn Sie versucht, Marschall TypeOf<T> der WCF-RIA-Services, wie Sie Ihre POCO-Klassen, da Generika nicht ausgesetzt werden wie WCF-oder WCF-RIA-Services (ohne einige wichtige workarounds).
Verwenden Sie jede Art spezifische Informationen über Erstklassige<U>? Wenn nicht, was ich dazu neigen, in diesen Fällen ist FirstClass<U> match einige IGenericFirstClass-Schnittstelle und geben Sie dann die Einschränkung als IGenericFirstClass. Es blendet die Typ-U-Abhängigkeit.
Sind U und T verschiedene Arten?
Ich bearbeitet den code, um zu versuchen zu klären

InformationsquelleAutor cadrell0 | 2011-04-05

Schreibe einen Kommentar