2012-07-03 44 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>(); } 
    } 
}