Ограничения метода vb.net - PullRequest
       24

Ограничения метода vb.net

2 голосов
/ 22 февраля 2011

У меня есть класс, который я пометил как MustInherit (называемый BasePage), с универсальным методом, помеченным как MustOverride:

Protected MustOverride Function SaveData(Of T As {BaseClass})(ByVal item As T) As T

Что я хочу сделать, так это заставить пользователей этого методаукажите только тип BaseClass или что-либо производное от него.Кроме того, когда класс наследуется от BasePage, он должен работать только с одним производным классом из BaseClass:

Protected Overrides Function SaveData(Of T As BaseClass)(ByVal item As T) As T
  Dim grad As DerivedClass = CType(item, DerivedClass)

  Return grad
End Function

Однако, когда я пытаюсь выполнить приведение, он выдает следующую ошибку:

Value of type 'T' cannot be converted to 'DerivedClass'.

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

Есть идеи?

Ответы [ 2 ]

1 голос
/ 22 февраля 2011

Вся документация, которую я прочитал, предполагает, что это должно работать.

Напротив: не может работать. Тип T происходит от BaseClass - но ничто в вашем коде не говорит компилятору, что он конвертируется в DerivedClass. Например, это может быть тип IndependentlyDerivedClass, который является родным из DerivedClass.

Тем не менее, следующие кастовые работы:

Dim grad As DerivedClass = DirectCast(DirectCast(item, BaseClass), DerivedClass))

Обратите внимание, что я использую DirectCast вместо CType. Это лучший метод при приведении в иерархии классов, поскольку DirectCast только разрешает такие приведения (эти и преобразования в бокс / распаковку), поэтому вы сводите к минимуму риск случайного вызова оператора преобразования (который может произойти, когда вы используете CType для несвязанных типов).

1 голос
/ 22 февраля 2011

Обычно вы делаете что-то вроде этого

Public MustInherit Class BasePage(Of T As BaseClass)
    Public MustOverride Function Savedata(ByVal Item As T) As T
End Class

Public Class derivedPage
    Inherits BasePage(Of DerivedClass)

    Public Overrides Function Savedata(ByVal Item As DerivedClass) As DerivedClass
        Dim grad As DerivedClass = Item
        Return grad
    End Function

End Class

Public MustInherit Class BaseClass

End Class

Public Class DerivedClass
    Inherits BaseClass

End Class
...