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

Can a generic in vb access shared data?

我想做这样的事情:

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

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

Shared 基本上就是 static。它不依赖于 class 的实例,并且不能被继承或覆盖或绑定到像接口这样的契约。

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

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

您不能对类型参数调用方法。只是做:

X.some_text

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

Dim text = X.some_text

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

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

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


更新

如果您想 return 不同子类型中的不同文本,请使用可覆盖的字符串 属性

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