2010-11-01 56 views
16

我已經實現兩個接口的對象...的接口有:指定多個接口的參數

public interface IObject 
{ 
    string Name { get; } 
    string Class { get; } 
    IEnumerable<IObjectProperty> Properties { get; } 
} 
public interface ITreeNode<T> 
{ 
    T Parent { get; } 
    IEnumerable<T> Children { get; } 
} 

這樣

public class ObjectNode : IObject, ITreeNode<IObject> 
{ 
    public string Class { get; private set; } 
    public string Name { get; private set; } 
    public IEnumerable<IObjectProperty> Properties { get; set; } 
    public IEnumerable<IObject> Children { get; private set; } 
    public IObject Parent { get; private set; } 
} 

現在我有需要的一個功能了參數來實現這兩個接口。我將如何去指定在C#中?

一個例子是

​​

抑或是我的設計是不對的問題,我要實現兩者一個接口莫名其妙

+1

「現在我有一個函數需要它的一個參數來實現這兩個接口。」函數或參數不實現接口,類實現接口。你什麼意思? – McKay 2010-11-01 22:01:29

+0

請參閱修改。我知道只有類可以實現接口 – TerrorAustralis 2010-11-01 22:04:57

+0

可能的重複[是否有可能使參數實現兩個接口?](http://stackoverflow.com/questions/772053/is-it-possible-to-make-a-參數-interface-two-interfaces) – 2014-11-18 11:39:16

回答

24
public void Foo<T>(T myParam) 
    where T : IObject, ITreeNode<IObject> 
{ 
    // whatever 
} 
+0

這是一個很好的答案。我意識到我留下了一些關鍵信息。我引用的函數是另一個類的構造函數(該方案是一個Node構建另一個節點)可以泛型在構造函數中使用 – TerrorAustralis 2010-11-01 22:09:17

+1

由於這個答案對我的問題有效,我會接受它,但構造函數正在導致我頭痛:) – TerrorAustralis 2010-11-01 22:49:34

+0

在這種情況下,我認爲你必須讓這個類變得通用。看起來你不能在非泛型類上使用泛型構造函數。 – 2010-11-02 00:36:44

13

在C#中對這些接口,接口可以將自己從一個或繼承更多其他接口。因此,一種解決方案是定義一個接口,例如來自IObjectITreeNode<T>IObjectTreeNode<T>

+3

-1:這會改變需求。此方法不需要參數來實現IObject和ITreeNode ,它需要參數來實現IObjectTreeNode 。所以實現這兩個接口但不是組合的對象是不允許的,而他們應該這樣做。 – 2016-12-09 10:14:43

-3
public void MethodName<TParam1, TParam2>(TParam1 param1, TParam2 param2) 
    where TParam1 : IObject 
    where TParam2 : ITreeNode<IObject> 
+4

您已經定義了一個實現'IObject'的參數,另一個實現了'ITreeNode ',但我認爲提交者需要一個實現這兩個參數的參數。 – 2010-11-01 22:07:26

2

這可能比較容易定義實現既IObject提取和ITreeNode的接口。

public interface IObjectNode<T> : IObject, ITreeNode<T> 
{ 
} 

另一種選擇,如果你不期望上述接口將經常使用,則是使通用的方法/功能成爲問題。

public void Foo<T>(T objectNode) where T : IObject, ITreeNode<IObject> 
+0

-1;這只是重複了以前的答案,並不承認[Stijn在評論中指出的缺點](http://stackoverflow.com/questions/4073440/specifying-multiple-interfaces-for-a-parameter#comment69322597_4073481)第一種方法。 – 2017-05-16 09:58:37