C#泛型和接口

时间:2012-07-03 11:21:32

标签: c# generics inheritance interface

可以实现这样的东西吗?我在类SomeClass的声明中遇到此代码的问题。

我收到的例外是:

  

'WindowsFormsApplication1.SomeClass'未实现接口成员'WindowsFormsApplication1.IB.SomeGetter'。 'WindowsFormsApplication1.SomeClass.SomeGetter'无法实现'WindowsFormsApplication1.IB.SomeGetter',因为它没有匹配的返回类型'WindowsFormsApplication1.MyClass'。

我的代码:

public interface IA
{ }

public interface IB
{
    MyClass<IA> SomeGetter { get; }
}

public class A : IA
{ }

public class MyClass<T>
    where T : IA
{ }

public class SomeClass : IB
{
    public MyClass<A> SomeGetter
    {
        get { return new MyClass<A>(); }
    }
}

知道该怎么做吗?

2 个答案:

答案 0 :(得分:5)

要实现这一目标,您需要引入一个界面(MyInterface)来使用covariance

public interface IA
{ }

public interface IB
{
    MyInterface<IA> SomeGetter { get; }
}

public class A : IA
{ }

public interface MyInterface<out T>
    where T : IA
{ }

public class MyClass<T> : MyInterface<T> where T : IA
{ }

public class SomeClass : IB
{
    public MyInterface<IA> SomeGetter
    {
        get { return new MyClass<A>(); }
    }
}

答案 1 :(得分:0)

您可能想要为MyClass引入一个界面:

public interface IMyClass<out T> where T : IA
{

}

class MyClass<T> : IMyClass<T> where T : IA
{
}

注意界面中的'out'关键字。然后你可以写

public class SomeClass : IB
{
    public IMyClass<A> SomeGetter
    {
        get { return new MyClass<A>(); }
    }
}