具有通用参数和抽象类的泛型

cad*_*ll0 15 c# generics silverlight

我有两个通用的基类.第二个泛型类对其第一个类的参数有约束.

abstract class FirstClass<T> {...}

abstract class SecondClass<U> where U : FirstClass {...}
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为没有定义FirstClass.所以我需要这样做.

abstract class FirstClass<T> {...}

abstract class SecondClass<U, T> where U : FirstClass<T> {...}
Run Code Online (Sandbox Code Playgroud)

哪个有效.但是,这使得实现这些抽象类很难看.

class SomeClass {...}

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

class MySecondClass : SecondClass<MyFirstClass, SomeClass> {...}
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎是多余的,因为我正在指定SomeClass两次.有没有办法以这样的方式声明它,即FirstClass中的T自动为SecondClass的U. 我真正想要的是这样.

class SomeClass {...}

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

class MySecondClass : SecondClass<MyFirstClass> {...}
Run Code Online (Sandbox Code Playgroud)

虽然我怀疑这种确切的情况是可能的,但是有什么更清洁的我该做什么呢?

编辑

有几个人建议制作一个IFirstClass接口.但我的定义更接近于此.

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

class SecondClass<U, T> where U : FirstClass<T>
{
    U MyFirstClass { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

使用接口,我无法从SecondClass访问MyFirstClass.MyObj.虽然我可以创建一个object T MyObj { get; set; } on IFirstClass, then use new关于IFirstClass,然后使用object T MyObj { get; set; } on IFirstClass, then use new隐藏它,如果我这样做,silverlight会在绑定中抛出一个契合.

Ste*_*ger 11

根据我的经验,最简单的方法是创建泛型类的非泛型接口.当您需要在不知道泛型类型的情况下强制转换为基类时,它也解决了这个问题.

interface IFirstClass {...}

abstract class FirstClass<T> : IFirstClass {...}

abstract class SecondClass<T> where T : IFirstClass {...}
Run Code Online (Sandbox Code Playgroud)


Ada*_*son 8

如果您实际上正在使用泛型类型参数FirstClass(因为,从您的编辑中,这听起来像您一样),那么不,不幸的是,您正在寻找的是不可能的。编译器不区分相关和不相关的类型参数。