Объекты интерфейса, но ограничение на тип, реализующий интерфейс - PullRequest
1 голос
/ 24 февраля 2011

У меня есть универсальный метод с ограничением, как показано ниже:

private string GetResult<T>(T myObject) where T : IDoSomething<T>
{
......
}

Теперь проблема в том, что IDoSomething реализуется классами, а не интерфейсом классов, и, кроме того, объекты всегдасозданный с использованием интерфейса в качестве типа, а не класса, подобного:

IClassA myObject = new ClassA();

Таким образом, всякий раз, когда вызывается универсальный метод, необходимо выполнить приведение к myObject, чтобы переслать его как параметр.

Есть ли способ избежать приведения и заставить код работать?(кроме опции наследования IDoSomething в IClassA)

Ответы [ 3 ]

5 голосов
/ 24 февраля 2011

Нет, я не думаю, что вы можете избежать приведения, поскольку интерфейс IClassA никак не связан с IDoSomething.

Тот факт, что некоторый класс, который реализует один интерфейс, также реализует другой интерфейс, не делает эти два интерфейса совместимыми.

Даже присвоение объекта IClassA обратно переменной ClassA требует явного приведения.

4 голосов
/ 24 февраля 2011

Нет , нет способа избежать броска так, как вы это делаете.

Если вы не хотите, чтобы IDoSomething<T> и IClassA были связаны по расширению, и вы не хотите использовать переменную, типизированную конкретным классом, то для компилятора нет никакой информациииспользовать, чтобы сделать вывод, что ваш объект реализует правильный интерфейс для метода без использования приведения.

0 голосов
/ 24 февраля 2011

Это зависит. Ты просто пытаешься получить Т? В этом случае вы можете сделать:

private static string GetResult<T>(IDoSomething<T> myObject) {}

Тогда T будет правильно выведено из интерфейса (так как IClassFoo всегда будет наследовать от него), и вам не нужно будет приводить.

Если вы хотите передать его как T, хотя И не нужно его разыгрывать, тогда вам не повезло, вы не можете использовать отношения.

...