наследование от универсального интерфейса с параметром типа - PullRequest
0 голосов
/ 21 июня 2011

Код говорит сам за себя:

interface a { }
interface ab : a { }
interface ac : a { }
interface igeneric<T> { }

//this is OK
class Clazz : igeneric<ab>, igeneric<ac>
{
}

//compiler error : 'Clazz2<T>' cannot implement both '<ac>' and 'igeneric<T>' because they may unify for some type parameter substitutions
class Clazz2<T> : igeneric<T>, igeneric<ac> where T : ab
{ 
}

Есть идеи?Обходные?

1 Ответ

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

Да, несколько идей:

  • Вы, конечно, не можете делать то, что пытаетесь сделать.Компилятор дал понять:
  • Вам определенно не нужно делать то, что вы пытаетесь сделать.Generic - это type-less наследование поведения.Реализация 2 type-full универсальных интерфейсов одного типа не имеет смысла .
  • Вы не представили исходную проблему, которую пытаетесь решить.Если вы это сделаете, мы могли бы помочь вам с дизайном.

ОБНОВЛЕНИЕ

Они не одного и того же вида, один г идругой это г.Подумайте об IMessageHandler и IMessageHandler в классе, реализующем и Handle (MessageA), и Handle (MessageB)

В реальном мире вы бы этого не сделали.Также это может привести к многочисленным проблемам.Допустим, у нас есть:

interface IFactory<T>
{
   T Create();
}

Тогда, если я реализую два:

class DontDoIt : IFactory<A>, IFactory<B>
{
    A Create();
    B Create(); // won't compile
}

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

...