Указание нескольких интерфейсов для параметра - PullRequest
19 голосов
/ 02 ноября 2010

У меня есть объект, который реализует два интерфейса ... Интерфейсы:

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 ]

28 голосов
/ 02 ноября 2010
public void Foo<T>(T myParam)
    where T : IObject, ITreeNode<IObject>
{
    // whatever
}
12 голосов
/ 02 ноября 2010

В C # интерфейсы могут наследовать один или несколько других интерфейсов.Таким образом, одним из решений было бы определить интерфейс, скажем, IObjectTreeNode<T>, который является производным от IObject и ITreeNode<T>.

0 голосов
/ 02 ноября 2010

Вероятно, проще всего определить интерфейс, который реализует как IObject, так и ITreeNode.

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

Другой вариант, если вы не ожидаете, что вышеуказанный интерфейс будет часто использоваться, - это сделать соответствующий метод / функцию универсальным.

public void Foo<T>(T objectNode) where T : IObject, ITreeNode<IObject>
0 голосов
/ 02 ноября 2010
public  void MethodName<TParam1, TParam2>(TParam1 param1, TParam2 param2) 
    where TParam1 : IObject
    where TParam2 : ITreeNode<IObject> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...