[英]VB.NET and OOP - Shared Methods and Base Properties
如果你不能使用Me.
在非实例方法中,您将如何在Shared
方法中使用基础 class 中的属性/函数?
例如, ClassB
继承自ClassA
ClassB
有一个Shared Method DoWork()
; ClassA
有一个ReadOnly Property SecurityKey
我如何能 …
Public Sub DoWork()
Dim test as String = Me.SecurityKey
End Sub
如果你不能使用“我”。 在非实例方法中,您将如何在共享方法中使用基础 class 中的属性/函数?
你不能。 共享方法(以及 C# 中的static
)不能与 OOP 一起很好地工作。 这(即静态/共享方法不能是虚拟/可覆盖的事实)可以说是 .NET 系统中的设计缺陷,该系统“继承”自 Java。 共享方法实际上不是 object 方法,而是名称为 scope 的全局方法。
此外,也许与您的问题更相关的是,您总是需要一个实例来访问非共享方法(该方法被共享,不属于任何特定实例)。
您通过类名而不是实例标识符访问共享成员。IE: ClassA.DoWork()
您不能从共享方法/成员访问实例成员,因为它们是不同的 scope。 但是,您可以从实例 scope 访问共享成员,而无需使用实例标识符。
尝试将 class 的实例传递给您的方法或在共享方法中实例化 class。
Public Shared Sub DoWork(instance As ClassB)
Dim test As String = instance.WhateverProperty;
End Sub
使用您的示例:
当共享的ClassB.DoWork()
尝试引用Me.SecurityKey
属性时,应该获取哪个ClassA
实例?
如果您将ClassA.SecurityKey
属性也共享,那会更有意义,但是 inheritance 关系不再重要。 您也可以在该方法中ClassA.SecurityKey
,因为无论如何您都必须知道 ClassA 才能知道它的继承属性。
如果将ClassB.DoWork()
作为实例方法而不是共享方法,则可以使用 VB.Net 中的MyBase
关键字来引用继承的 ClassA 属性,即使 ClassB 重载或隐藏它。
如果您在 static 上下文中,则需要实例化此 class 以访问其实例成员。
Dim s as SecKey = ClassA.SecurityKey
这来自共享方法。 请记住,共享方法由 class 的所有实例共享,因此您使用 class 名称来拉取它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.