Использование интерфейса для универсального типа с ограничением конструктора без параметров? - PullRequest
2 голосов
/ 08 июня 2011

У меня есть универсальный класс, скажем, MyCollection , которому нужен его универсальный тип T с конструктором без параметров.У меня есть интерфейс IMyInterface со всеми реализациями, имеющими конструкторы без параметров, но я не могу сообщить этот факт компилятору, поэтому я не могу использовать IMyInterface в качестве параметра типа T. Что мне делать?

public class MyCollection<T> where T : new()
{
    bla bla ...
    T t = new T();
}

public interface IMyInterface
{
    bla bla ...
}
...
MyCollection<IMyInterface> x;   //Compile Time Error

Я знаю, чтопочти такой же вопрос был задан в Интерфейсе, определяющем сигнатуру конструктора? , но ему два года, и я надеюсь, что кто-то может предложить обходной путь в C # 4.0.

Ответы [ 2 ]

3 голосов
/ 08 июня 2011

Это не будет работать, потому что T t = new T(); с интерфейсом как T, он станет IMyInterface t = new IMyInterface();, что совершенно недопустимо. Вы должны знать, что такое конкретная реализация для построения вашего типа. Вы не можете использовать абстрактный тип или интерфейс в одиночку с новым. Если MyCollection является вашим собственным классом, если вы добавили параметр в конструктор, чтобы установить T t в конструкторе, передав вашу конкретную реализацию, удалите новое ограничение параметра и затем используйте интерфейс в качестве универсального параметра.

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

Другой способ иметь дело с универсальными классами, которые должны иметь возможность конструировать объекты универсального типа, но которые по какой-либо причине не могут использовать ограничение New, - это передать фабрику методам, которые должны будут создавать новые объекты универсальный тип или требует, чтобы как часть интерфейса классы, реализующие его, предоставляли средства для создания другого экземпляра. Например, при первом использовании можно определить интерфейс IFactoryFromString , который включает в себя метод «T CreateFromString (String st)», и передать такую ​​фабрику подпрограмме, которая должна иметь возможность создавать T с заданной строкой. Например, например, для второго использования, интерфейс для чего-то, что ведет себя как узел дерева, может включать метод для создания другого подобного узла дерева. Второе использование устраняет необходимость в дополнительных фабричных классах и параметрах, но требует, чтобы один действительно имел экземпляр класса, удовлетворяющий ограничению, для создания другого.

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