vb中的泛型可以访问共享数据吗?

时间:2015-01-30 16:56:19

标签: vb.net generics

我想做这样的事情:

public class X
  public shared some_text as string
  public sub do_something()
    ...
  end sub
end class

public class Y(of T as X)
  public shared function get_one() as T
    dim text=T.some_text
    ... whatever ...
  end function
end class

但是" T.some_text"给出一个错误,说我不能使用T作为限定词。有没有办法在不创建实例的情况下访问T中的共享数据或函数?

看来我可以说

dim dummy as new T()
dim text=dummy.some_text

然后我收到警告,我不应该使用实例来访问共享数据,但我不知道如何在不创建实例的情况下访问共享数据! : - (

3 个答案:

答案 0 :(得分:1)

您无法在类型参数上调用方法。只是做:

X.some_text

答案 1 :(得分:1)

some_textX的共享成员。所以你必须写:

Dim text = X.some_text

如果您想访问Y的共享成员(通用),您必须写:

Dim result = Y(Of X).get_one()

您无法通过类型参数访问共享成员。共享成员不遵循实例成员的继承规则;他们是静止的。您无法覆盖共享成员(如果您尝试使共享成员可覆盖,则会出现编译器错误:" '共享'无法与' Overridable'方法声明。");因此,您必须通过定义它们的类型访问它们。它们与模块成员基本相同;但是,它们必须使用类型名称进行限定。


<强>更新

如果要在不同的子类型中返回不同的文本,请使用可覆盖的字符串属性

Public Class X
    Public Overridable ReadOnly Property some_text() As String
        Get
            Return "x text"
        End Get
    End Property
End Class

Public Class Derived
    Inherits X
    Public Overrides ReadOnly Property some_text() As String
        Get
            Return "derived text"
        End Get
    End Property
End Class

答案 2 :(得分:0)

Shared基本上是static。它不依赖于类的实例,不能继承或覆盖或绑定到类似接口的契约。

这意味着它在泛型方面有些无用,并且没有内置的功能来访问它。我认为只有VB允许从实例访问Shared成员。普通约定虽然不是从实例访问它,而是从类本身访问它。

正如@JAT在评论中提到的那样,如果您的示例是实际设置的1:1,则可以致电X.some_text