为参数指定多个接口

Ter*_*lis 21 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; }
}
Run Code Online (Sandbox Code Playgroud)

这样的

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; }
}
Run Code Online (Sandbox Code Playgroud)

现在我有一个函数需要其中一个参数来实现这两个接口.我将如何在C#中指定它?

一个例子是

public TypedObject(ITreeNode<IObject> baseObject, IEnumerable<IType> types, ITreeNode<IObject>, IObject parent)
{
    //Construct here
}
Run Code Online (Sandbox Code Playgroud)

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

Jes*_*rew 31

public void Foo<T>(T myParam)
    where T : IObject, ITreeNode<IObject>
{
    // whatever
}
Run Code Online (Sandbox Code Playgroud)

  • 由于这个答案对我的问题有效,我会接受它,但构造函数的事情让我头疼:) (2认同)

And*_*tad 12

在C#中,接口本身可以从一个或多个其他接口继承.所以,一个解决办法是定义一个接口,比方说IObjectTreeNode<T>来自两个派生IObjectITreeNode<T>.

  • -1:这会改变要求.此方法不需要参数来实现IObject和ITreeNode <T>,它需要参数来实现IObjectTreeNode <T>.因此,不允许实现两个接口而不是组合接口的对象. (5认同)