Вернуть унаследованные дженерики как базовые дженерики - PullRequest
0 голосов
/ 26 января 2009

У меня есть BaseAbstractClass(of T as WebControl) (VB Generics), который наследует WebControl.

BaseAbstractClass наследуется ConcreteWrapper1, ConcreteWrapper2 и, наконец, чтобы немного встряхнуть, ConcreteWrapper4. Каждый из них наследовал бы BaseAbstractClass, используя другой класс, унаследованный от WebControl.

Я хотел бы иметь фабрику, которая возвращает ConcreteWrapper как BaseAbstractClass(of WebControl). Но всякий раз, когда я пытаюсь вернуть новый экземпляр ConcreteWrapper, я получаю ошибку преобразования времени компиляции.

[Редактировать: Код добавлен]

BaseAbstractClass

Public MustInherit Class BaseAbstractClass(Of T As WebControl)
    Inherits WebControl

    Protected _item As T

    Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
        _item.RenderControl(writer)
    End Sub
End Class

Другие ConcreteWrappers выглядят так, за исключением другого CustomControl

Public Class ConcreteWrapper1
    Inherits BaseAbstractClass(Of CustomControlInheritedFromWebControl1)

    Public Sub New(ByVal control As CustomControlInheritedFromWebControl1)
        MyBase._item = control
    End Sub
End Class

Public Class CustomControlInheritedFromWebControl1
    Inherits WebControl

    //not the correct comment markers but the coloring works better
    //do stuff here... Implm not important.

End Class

Моя фабрика

Public Class WebControlFactory

    Public Shared Function GetWebControl() As BaseAbstractClass(Of WebControl)

        Return New ConcreteWrapper1(New CustomControlInheritedFromWebControl1())

    End Function

End Class

[/ Edit]

Могу ли я получить объяснение того, что происходит и почему это не сработает (и, возможно, решение)?

Спасибо!

1 Ответ

2 голосов
/ 26 января 2009

ConcreteWrapper1 не наследуется от BaseAbstractClass(of WebControl), а наследуется от BaseAbstractClass(of T)

BAC (из WebControl) не взаимозаменяем с BAC (из T).

Если вы должны использовать наследование, вам нужно два уровня абстракции.

WebControl
  BAC inherits WebControl
    BAC(of T) inherits BAC
      Wrapper1 inherits BAC(of int)
      Wrapper2 inherits BAC(of string)
      Wrapper3 inherits BAC(of Foo)
      Wrapper4 inherits BAC(of Bar)

Тогда вы можете вернуть все экземпляры своих Оберток как BAC.

Причина хорошо сформулирована Zooba :

Нельзя приводить между универсальными типами с различными параметрами типов. Специализированные универсальные типы не образуют часть одного и того же дерева наследования и, следовательно, являются несвязанными типами.

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