2010-11-01 60 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