2012-07-03 107 views
2

有可能实现这样的事情吗?我在SomeClass类的声明中遇到此代码的问题。C#泛型和接口

是我收到的例外是:

'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>(); } 
    } 
} 

任何想法,该怎么办呢?

回答

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>(); } 
    } 
} 
+0

没错。您必须在吸气剂中使用MyClass 。这样做的工作,但你必须使用接口,不能使用类A. – MatthiasG

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>(); } 
    } 
}