2011-09-10 60 views
0

我有一些類如下其中實現一個接口:定義類型的屬性「的Class1:接口1」到另一個接口

class C1 : IpropTemplate { ... } 

class C2 : IpropTemplate { ... } 

: 

也有是實現另一個接口的一些其它類:

class C3 : IclassTemplate { ... } 

現在,我需要在IclassTemplate中指定一個屬性的簽名,以強制C3擁有一個從IpropTemplate實現的屬性。 (如C1C2等)

我嘗試這樣做:

interface IclassTemplate 
{ 
    ... 
    IpropTemplate prop1 { get; set; } 
} 

class C3 : IclassTemplate 
{ 
    ... 
    public C1 prop1 
    { 
     get; 
     set; 
    } 
} 

在這種情況下,編譯器生成指示C3不實現接口構件IclassTemplate.prop1並且該C3.prop1不能實現IpropTemplate.prop1由於出錯它沒有匹配的返回類型IpropTemplate

我該怎麼辦? 感謝

回答

2

你不能讓你的C3實現交易在C1 - 畢竟,你保證,這將是有效的:

IClassTemplate c3 = new C3(); 
c3.Template = new C2(); 

如果你只需要能夠閱讀的財產,這是稍微容易:

interface IClassTemplate 
{ 
    IPropTemplate Template { get; } 
} 

public class C3 : IClassTemplate 
{ 
    private readonly C1 c1 = new C1(); 

    IPropTemplate Template { get { return c1; } } 
} 

這讓代碼C3知道它確實是C1,但仍然實現該接口。

另一種選擇是讓你的界面通用:

interface IClassTemplate<T> where T : IPropTemplate 
{ 
    T Template { get; set; } 
} 

public class C3 : IClassTemplate<C1> 
{ 
    public C1 Template { get; set; } 
} 

希望這些人會滿足您的需求 - 如果不是,請提供關於你真正想實現更多的細節 - 大局觀。

+0

感謝您關於把現場的界面提示。我沒有在我的編程中放入一個字段。但是在這裏我不小心編寫了代碼片段,我已經糾正了它。 – Mimi

+0

@Mimi:好的,我會編輯。您可能想要讓您的示例名稱同時遵循.NET命名約定;) –

0

返回類型屬性的簽名的一部分 - 它必須是IpropTemplate類型:

public IpropTemplate prop1 
{ 
    get; 
    set; 
} 

然後,你可以把它分配給一個C1 ANS以及C2的對象。

... 
prop1 = new C1(); 
0

代替C1,在屬性簽名中寫入IPropTemplate。在推理之後,你可以對C1類型進行操作,但簽名必須暴露一個接口,因爲IclassTemplate以這種方式定義它。

0

只是做

class C3 : IclassTemplate 
{ 
    ... 
    public C1 prop1 
    { 
     get; 
     set; 
    } 
    public IpropTemplate prop1 {get;set;} 
} 
+1

這甚至如何工作?在同一個類中不能有兩個相同名稱的不同屬性。 – BoltClock

相關問題