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的不同子类型可以有不同的值,我想得到泛型对象的构造函数中给出的子类型所使用的值。我猜人们在这里说的是,这是不可能的。这显然不是我想要听到的答案,但如果是这样的话,哦,好吧。