为参数指定多个接口

时间:2010-11-01 21:57:55

标签: c# interface composition

我有一个实现两个接口的对象......接口是:

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#中指定它?

一个例子是

public TypedObject(ITreeNode<IObject> baseObject, IEnumerable<IType> types, ITreeNode<IObject>, IObject parent)
{
    //Construct here
}

或者问题是我的设计是错误的,我应该以某种方式在一个接口上实现这两个接口

4 个答案:

答案 0 :(得分:28)

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

答案 1 :(得分:12)

在C#中,接口本身可以从一个或多个其他接口继承。因此,一种解决方案是定义一个接口,比如IObjectTreeNode<T>IObject都可以得到ITreeNode<T>

答案 2 :(得分:0)

定义一个实现IObject和ITreeNode的接口可能最简单。

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

如果您不希望经常使用上述接口,则另一个选项是使有问题的方法/函数通用。

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

答案 3 :(得分:-4)

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