繁体   English   中英

VB.NET 和 OOP - 共享方法和基本属性

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM