Vb.net vb中的泛型可以访问共享数据吗?
我想这样做:Vb.net vb中的泛型可以访问共享数据吗?,vb.net,generics,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 clas
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
然后我得到一个警告,我不应该使用实例访问共享数据,但我不知道如何在不创建实例的情况下访问共享数据!:-(
共享
基本上是静态的
。它不绑定到类的实例,不能像接口一样继承、重写或绑定到协定
这意味着它在泛型方面有些无用,并且没有访问它的内置功能。我认为只有VB允许从实例访问Shared
成员。通常的约定不是从实例访问,而是从类本身访问
正如@JAT在评论中提到的,如果您的示例是实际设置的1:1,您可以调用
X.some_text
。您不能调用类型参数的方法。只需执行以下操作:
X.some_text
某些文本是X
的共享成员。因此您必须编写:
Dim text = X.some_text
Dim result = Y(Of X).get_one()
如果要访问Y
(通用)的共享成员,必须编写:
Dim text = X.some_text
Dim result = Y(Of X).get_one()
无法通过类型参数访问共享成员。共享成员不遵循实例成员的继承规则;它们是静态的。无法重写共享成员(如果尝试使共享成员可重写,则会出现编译器错误:“'shared'不能与方法声明上的'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
如果T始终是X,则可以执行X.some_text
get_one()设置属性,它返回T,但T始终是X,那么为什么不直接使用构造函数呢?@jat我的意图是T可以是X的子类型。我的意图是不同的子类型的X对于某些文本可能有不同的值。我猜你是说,答案是,你不能这样做。这正是我所担心的。是你的更新;是的,a在我发布了这个问题之后,我想到了解决方案。文本必须是常量才能起作用,但在我的实际情况中,它是常量。好吧,我想如果不是,函数可以返回一个共享变量的值,每个子类中有一个不同的共享变量。是的,它可以返回不同共享变量或常量的值。(默认情况下,常数是共享的)我的意图是X的不同子类型可以有不同的值,我想得到泛型对象的构造函数中给出的子类型所使用的值。我猜人们在这里说的是,这是不可能的。这显然不是我想要听到的答案,但如果是这样的话,哦,好吧。