代码之家  ›  专栏  ›  技术社区  ›  Jay

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

  •  2
  • Jay  · 技术社区  · 11 年前

    我想这样做:

    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
    

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

    3 回复  |  直到 11 年前
        1
  •  1
  •   Olivier Jacot-Descombes    11 年前

    some_text 是的共享成员 X 。所以你必须写:

    Dim text = X.some_text
    

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

    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
    
        2
  •  1
  •   The One    11 年前

    不能对类型参数调用方法。只要做到:

    X.some_text
    
        3
  •  0
  •   TyCobb    11 年前

    Shared 基本上是 static 。它不绑定到类的实例,并且不能继承、重写或绑定到类似接口的约定。

    这意味着它在Generics方面有些无用,并且没有内置的功能来访问它 共享 实例中的成员。不过,通常的约定不是从实例访问它,而是从类本身访问它。

    正如@JAT在评论中提到的,你可以打电话 X.some_text 如果您的示例是实际设置的1:1。