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_text
是 X
的共享成员。所以你必须写:
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
我想做这样的事情:
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_text
是 X
的共享成员。所以你必须写:
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