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.
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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie tatsächlich mit dem generischen Typ-Argumente zu
FirstClass
(wie aus dem edit, es klingt wie Sie sind), dann nicht, was Sie suchen, ist leider nicht möglich. Der compiler unterscheidet nicht zwischen Typ-Argumente, die in Zusammenhang stehen, und diejenigen, die nicht sind.careers.stackoverflow.com 😉 im Ernst, obwohl, vergessen Sie nicht zu akzeptieren, dass man diese Antworten. Diese sind so ziemlich Ihre einzigen Optionen.
InformationsquelleAutor
Meiner Erfahrung ist es am einfachsten, um nicht-generische Schnittstelle zu generischen Klassen. Es löst auch das problem, wenn Sie brauchen, um zu werfen, um die base-Klasse, ohne zu wissen, der generische Typ.
InformationsquelleAutor
Erstellen Sie eine Schnittstelle, die FirstClass implementiert. Dann können Sie beschränken SecondClass an die Schnittstelle.
InformationsquelleAutor