我想做这样的事情:
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
然后我收到警告,我不应该使用实例来访问共享数据,但我不知道如何在不创建实例的情况下访问共享数据! : - (
答案 0 :(得分:1)
您无法在类型参数上调用方法。只是做:
X.some_text
答案 1 :(得分:1)
some_text
是X
的共享成员。所以你必须写:
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
。