如果您不能在非实例方法中使用Me.
,那么如何在Shared
方法中使用基类中的属性/函数?
例如,ClassB
继承自ClassA
ClassB
有一个Shared Method DoWork()
;
ClassA
有一个ReadOnly Property SecurityKey
我如何......
Public Sub DoWork()
Dim test as String = Me.SecurityKey
End Sub
答案 0 :(得分:3)
如果你不能使用“我”。在非实例方法中,如何在Shared方法中使用基类中的属性/函数?
你做不到。共享方法(以及C#中的static
)与OOP不能很好地协同工作。这(即静态/共享方法不能虚拟/可覆盖的事实)是arguably .NET系统中从Java“继承”的设计缺陷。共享方法实际上不是对象方法,而是具有名称范围的全局方法。
此外,甚至可能与您的问题更相关,您总是需要一个实例来访问非共享方法(共享,不属于任何特定实例)。
答案 1 :(得分:2)
您可以通过类名访问共享成员,而不是实例标识符.IE:ClassA.DoWork()
您无法从共享方法/成员访问实例成员,因为它们的范围不同。但是,您可以从实例范围访问共享成员,而无需使用实例标识符。
尝试将类的实例传递给您的方法或在共享方法中实例化该类。
Public Shared Sub DoWork(instance As ClassB)
Dim test As String = instance.WhateverProperty;
End Sub
答案 2 :(得分:1)
使用您的示例:
共享ClassA
在尝试引用ClassB.DoWork()
属性时应该获得哪个Me.SecurityKey
实例?
如果你使ClassA.SecurityKey
属性也被分享会更有意义,但继承关系不再重要。您也可以在该方法中说ClassA.SecurityKey
,因为您必须已经了解ClassA以了解它的继承属性。
如果将ClassB.DoWork()
作为实例方法而不是共享方法,则可以使用VB.Net中的MyBase
关键字来引用继承的ClassA属性,即使ClassB重载或隐藏它也是如此。
答案 3 :(得分:0)
如果您处于静态上下文中,则需要实例化此类以访问其实例成员。
答案 4 :(得分:0)
Dim s as SecKey = ClassA.SecurityKey
这来自共享方法。请记住,共享方法由类的所有实例共享,因此您可以使用类名来提取它们。