2009-02-25 44 views
1

如果在非实例方法中不能使用Me.,那么如何使用Shared方法中的基类的属性/函数?VB.NET和OOP - 共享方法和基本属性

例如,来自ClassA
ClassBClassB继承具有Shared Method DoWork(); ClassAReadOnly Property SecurityKey

如何...

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

回答

3

如果你不能用 “我”。在非实例方法中,您将如何使用Shared方法中的基类的属性/函数?

你不行。共享方法(和C#中的static)不能与OOP一起使用。这个(即静态/共享方法不能被虚拟/可重写的事实)是.NET系统中“从Java继承”的设计缺陷。共享方法实际上不是对象方法,而是具有名称范围的全局方法。

此外,甚至可能与您的问题更相关,您总是需要一个实例来访问非共享方法(它被共享,不属于任何特定实例)。

+0

不幸的是,我试图帮助一些修复由完全非OOP人写的VB.NET混乱。我正在试图通过一些OOP来清理混乱。我认为这个人使用他的“B类”中的Shared方法来处理ASP.NET中的Object DataSources ...我不会使用那些 – BuddyJoe 2009-02-25 18:37:05

0

如果您在静态情况下的时候,你需要实例化这个类来访问它的实例成员。

2

您可以通过类名访问共享成员,而不是实例标识符。IE:ClassA.DoWork()您不能从共享方法/成员访问实例成员,因为它们是不同的作用域。但是,您可以从实例作用域访问共享成员,而无需使用实例标识符。

尝试将类的实例传递给您的方法或在共享方法中实例化类。

Public Shared Sub DoWork(instance As ClassB) 
    Dim test As String = instance.WhateverProperty; 
End Sub 
+0

我注意到如果我标记我的属性在ClassA中共享,我可以使用它...但仍然不能使用前缀“我”。有没有使用前缀/关键字?一些视觉提示/提示,这可以因为我继承的类吗? – BuddyJoe 2009-02-25 18:23:59

+0

不,您可以使用类资源管理器来帮助您看到类的不同成员具有的修饰符,但是您将无法访问具有像Me/this这样的实例标识符的对象的共享/静态成员。要记住的最好方法是,如果它被标记为共享,那么它总是ClassName.XXX – 2009-02-25 18:27:32

1

使用你的例子:

哪个ClassA实例应该当它试图共享ClassB.DoWork() GET引用Me.SecurityKey财产?

如果你让ClassA.SecurityKey属性也被共享,那会更有意义,但是继承关系不再重要。你也可以在该方法中说ClassA.SecurityKey,因为无论如何你必须已经知道ClassA才能知道它的继承属性。

如果您将ClassB.DoWork()作为实例方法而不是共享方法,则可以使用VB.Net中的MyBase关键字来引用继承的ClassA属性,即使ClassB重载或遮蔽它。

0
Dim s as SecKey = ClassA.SecurityKey 

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