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

时间:2009-02-25 18:15:52

标签: .net vb.net oop

如果您不能在非实例方法中使用Me.,那么如何在Shared方法中使用基类中的属性/函数?

例如,ClassB继承自ClassA
ClassB有一个Shared Method DoWork(); ClassA有一个ReadOnly Property SecurityKey

我如何......

Public Sub DoWork()
  Dim test as String = Me.SecurityKey 
End Sub  

5 个答案:

答案 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

这来自共享方法。请记住,共享方法由类的所有实例共享,因此您可以使用类名来提取它们。