1
class BaseItem { }

class DerivedItem : BaseItem { }

interface IInterface<T> where T is BaseItem { }

class RealizedInterface<T> : IInterface<T> { }

RealizedInterface<BaseItem> rb;
RealizedInterface<DerivedItem> rd = new RealizedInterface<DerivedItem>;

有没有什么方法可以投射,如下一行所示:

rb = rd;   

谁能告诉我如何rd投到rb

其实BaseItem本身也是一个泛化类但是为了简单的问题,没有写出来。class BaseItem<U,K> / DerivedItem<U,K>

对于那些能够理解我面临的真正问题的人来说。

IShape<IBaseShape<long>, long> shape;

这是一个声明的对象

IShape<ITriangle<long>, long> triangle =new Shape<ITriangle<long>,long>(); //Shape derived from IShape

shape = triangle; //here is the problem.

其中 ITriangle 派生自 IBaseShape。我真的很感激任何帮助。

结果:我决定不实现 out 关键字。就我而言,它并没有带来太多价值(这是一个持续数月的项目,到处都是仿制药)。具体来说,如果您考虑在带有in关键字的接口和带有out关键字的getter中实现 setter ,再加上在使用 out 关键字装饰的接口中使用泛型所产生的强制转换问题让我三思而后行。总而言之,如果您从头开始使用它们可能会很有用,否则可能会带来比您想象的更多的问题。

4

3 回答 3

5

您正在寻找的是泛型类型的协变和逆变。您可以在此处阅读该主题

于 2013-05-07T10:58:27.760 回答
1

如果IShape以您仅“检索”第一个类型参数的元素的方式定义,则将定义从更改IShape<T, U>IShape<out T, U>告诉编译器,然后一切都会正常工作(给定足够新的 .NET 版本)。

如果IShape以这样一种方式定义,您可以通过接口“推入”第一个类型参数元素,那么这不起作用。如果您将 an 隐藏起来IShape<ITriangle...>IShape<IBaseShape...>那么如果您尝试将 an 推ISquare入其中,它将破坏。

于 2013-05-07T11:01:17.943 回答
0

只要您继续使用接口而不是实际的类,就可以使用协变/逆变。

像这样:

void Main() {   
    RealizedInterface<BaseItem> rb1;
    RealizedInterface<DerivedItem> rd1 = new RealizedInterface<DerivedItem>();
    rb1 = rd1; // doesn't work

    IInterface<BaseItem> rb2;
    IInterface<DerivedItem> rd2 = new RealizedInterface<DerivedItem>();
    rb2 = rd2; // works
}

// Define other methods and classes here
class BaseItem { }

class DerivedItem : BaseItem { }

interface IInterface<out T> where T:  BaseItem { } // Notice the out keyword!

class RealizedInterface<T> : IInterface<T> where T:BaseItem { }
于 2013-05-07T11:01:04.840 回答