Несколько интерфейсов, содержащихся в одном списке <T> - PullRequest
0 голосов
/ 19 апреля 2011

Есть ли способ определить тип в универсальном классе, таком как List, чтобы он содержал объекты, которые реализуют только несколько интерфейсов?Возможно интерфейс класса и .

Например:

List<myObjectBase, IDisposable, IClonable> myList;

Ответы [ 6 ]

8 голосов
/ 19 апреля 2011

Не уверен, правильно ли я понял, но как насчет этого:

class MyList<T> : List<T>
  where T : myObjectBase, IDisposable, IClonable
{
}

Таким образом, вы можете добавлять в список только те объекты, которые являются производными от базы и реализуют эти интерфейсы.

1 голос
/ 30 августа 2011

Один из подходов, который может быть полезен, - это определить интерфейс ISelf , единственный член которого, Self, просто возвращает «this» как T; затем для любого интерфейса IWh независимо от того, что может быть объединено, определите общую версию IWhwhat , которая наследует как IWhothing и ISelf . В этом случае класс Whizbang, который реализует IFoo и IBar , будет неявно реализовывать ISelf , IFoo >, IBar > и т. Д. Процедура, которая требует чего-то, что реализует как IFoo, так и IBar может принимать параметр типа IFoo ; этот параметр будет реализовывать IFoo; Свою собственную собственность реализует IBar. Любой объект, который реализует несколько интерфейсов с использованием этого шаблона, может быть приведен к вложенному типу интерфейса данной формы с использованием некоторых или всех интерфейсов, перечисленных в любом порядке.

1 голос
/ 18 июня 2011

Ниже приведено простейшее решение для добавления нескольких интерфейсов, которые работали для меня.

Список myList = новый список ()

myFirstClass m1C = new myFirstClass();
mySecondClass m2C = new mySecondClass();

myList.Add(m1C);
myList.Add(m2C);

foreach (var item in myList)
{
    item.Clone();
    item.Dispose();
}

class myFirstClass : ICommonInterface  
{  
// implement interface methods  
}  

class mySecondClass : ICommonInterface  
{  
// implement interface methods  
}  


interface ICommonInterface : IDisposable, IClonable  
{  
}  


interface IDisposable  
{  
    void Dispose(){}  
}  

interface IClonable     
{  
    void Clone(){}  
}  
1 голос
/ 19 апреля 2011

Нет, множественные общие параметры не поддерживаются.

Это также не имеет особого смысла.Не было бы никакой пользы от использования универсального класса List<T> по сравнению с чем-то вроде ArrayList.Вы потеряете все преимущества безопасности типов и в конечном итоге будете вынуждены разыгрывать повсюду.

Лучшим вариантом будет создание составного класса, который обрабатывает все, что вы хотитесделать ... и затем использовать это:

public class CommonBase : MyBaseClass, ICloneable, IDisposable
{
}

И затем использовать это как ваш общий параметр:

var newList = new List<CommonBase>();
1 голос
/ 19 апреля 2011

Нет. В этом случае вам придется выразить это следующим образом:

public class CommonStuff : MyObjectBase, IDisposable, IClonable {}

Тогда вы можете написать:

List<CommonStuff> myList;
0 голосов
/ 19 апреля 2011

Вы можете использовать ArrayList и можете проверить тип объекта в этом списке - возможно, это удобнее.

if(list[i] is Type)
...