2009-02-25 46 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 

這從共享方法拉。請記住,共享方法由類的所有實例共享,因此您可以使用類名來提取它們。