如果在非实例方法中不能使用Me.
,那么如何使用Shared
方法中的基类的属性/函数?VB.NET和OOP - 共享方法和基本属性
例如,来自ClassA
ClassB
ClassB
继承具有Shared Method DoWork()
; ClassA
有ReadOnly Property SecurityKey
如何...
Public Sub DoWork()
Dim test as String = Me.SecurityKey
End Sub
如果在非实例方法中不能使用Me.
,那么如何使用Shared
方法中的基类的属性/函数?VB.NET和OOP - 共享方法和基本属性
例如,来自ClassA
ClassB
ClassB
继承具有Shared Method DoWork()
; ClassA
有ReadOnly Property SecurityKey
如何...
Public Sub DoWork()
Dim test as String = Me.SecurityKey
End Sub
如果你不能用 “我”。在非实例方法中,您将如何使用Shared方法中的基类的属性/函数?
你不行。共享方法(和C#中的static
)不能与OOP一起使用。这个(即静态/共享方法不能被虚拟/可重写的事实)是.NET系统中“从Java继承”的设计缺陷。共享方法实际上不是对象方法,而是具有名称范围的全局方法。
此外,甚至可能与您的问题更相关,您总是需要一个实例来访问非共享方法(它被共享,不属于任何特定实例)。
如果您在静态情况下的时候,你需要实例化这个类来访问它的实例成员。
您可以通过类名访问共享成员,而不是实例标识符。IE:ClassA.DoWork()
您不能从共享方法/成员访问实例成员,因为它们是不同的作用域。但是,您可以从实例作用域访问共享成员,而无需使用实例标识符。
尝试将类的实例传递给您的方法或在共享方法中实例化类。
Public Shared Sub DoWork(instance As ClassB)
Dim test As String = instance.WhateverProperty;
End Sub
我注意到如果我标记我的属性在ClassA中共享,我可以使用它...但仍然不能使用前缀“我”。有没有使用前缀/关键字?一些视觉提示/提示,这可以因为我继承的类吗? – BuddyJoe 2009-02-25 18:23:59
不,您可以使用类资源管理器来帮助您看到类的不同成员具有的修饰符,但是您将无法访问具有像Me/this这样的实例标识符的对象的共享/静态成员。要记住的最好方法是,如果它被标记为共享,那么它总是ClassName.XXX – 2009-02-25 18:27:32
使用你的例子:
哪个ClassA
实例应该当它试图共享ClassB.DoWork()
GET引用Me.SecurityKey
财产?
如果你让ClassA.SecurityKey
属性也被共享,那会更有意义,但是继承关系不再重要。你也可以在该方法中说ClassA.SecurityKey
,因为无论如何你必须已经知道ClassA才能知道它的继承属性。
如果您将ClassB.DoWork()
作为实例方法而不是共享方法,则可以使用VB.Net中的MyBase
关键字来引用继承的ClassA属性,即使ClassB重载或遮蔽它。
Dim s as SecKey = ClassA.SecurityKey
这从共享方法拉。请记住,共享方法由类的所有实例共享,因此您可以使用类名来提取它们。
不幸的是,我试图帮助一些修复由完全非OOP人写的VB.NET混乱。我正在试图通过一些OOP来清理混乱。我认为这个人使用他的“B类”中的Shared方法来处理ASP.NET中的Object DataSources ...我不会使用那些 – BuddyJoe 2009-02-25 18:37:05