C #, Object и несколько реализаций интерфейса: как правильно использовать? - PullRequest
2 голосов
/ 04 мая 2011

Итак, у меня есть два интерфейса:

public interface ISomething
{
    public int A();
}


public interface ISomethingElse
{
    public int B();
}

И объект, который реализует оба:

public class MyObject : ISomething, ISomethingElse
{      
}

Теперь у меня есть этот рабочий код:

...
List<MyObject> objects = myObjectManager.SelectAll(); // now have say 10 MyObject

MyUtilityClass myUtilityClass = new MyUtilityClass();
MyOtherUtilityClass myOtherUtilityClass = new MyOtherUtilityClass();
myUtilityClass.MySpecialMethod(objects);                  // <- compile failure
myOtherUtilityClass.MySpecialMethod(objects);             // <- another failure
...

Если я хочу вызвать A или B на всех из них, как я могу написать код, подобный этому:

public class MyUtilityClass
{
    public void MySpecialMethod(List<ISomething> objects) // <- the problem
    {
        foreach (ISomething o in objects)
            o.A();   
    }
}

public class MyOtherUtilityClass
{
    public void MySpecialMethod(List<ISomethingElse> objects) // <- the problem
    {
        foreach (ISomethingElse o in objects)
            o.B();   
    }
}

Как я могу чисто позвонить MyUtilityClass.MySpecialMethod() на моем List<MyObject> objects?Возможно ли это без всех типов?Параметры MyUtilityClass.MySpecialMethod(), по-видимому, являются проблемой (я хочу определить параметр как список объектов, которые реализуют ISomething).

Ответы [ 4 ]

5 голосов
/ 04 мая 2011

Вы можете использовать IEnumerable<> интерфейс вместо List<>. IEnumerable<> является ковариантным.

4 голосов
/ 04 мая 2011

Лично я бы использовал следующую подпись, поскольку IEnumerable<T> является ковариантным:

public void MySpecialMethod(this IEnumerable<ISomething> objects) // <- the problem
{
    foreach (ISomething o in objects)
        o.A();   
}

Называя его:

objects.MySpecialMethod();
4 голосов
/ 04 мая 2011

Список не поддерживает ковариация .

Вы можете изменить его на IEnumerable<ISomething> и передать List<MyObject>.

1 голос
/ 04 мая 2011

Не должно

public void MySpecialMethod(List<MyObject> objects)
{
    foreach (ISomethingElse o in objects)
        o.B();   
}

работа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...