如果在非實例方法中不能使用Me.
,那麼如何使用Shared
方法中的基類的屬性/函數?VB.NET和OOP - 共享方法和基本屬性
例如,來自ClassA
ClassB
ClassB
繼承具有Shared Method DoWork()
; ClassA
有ReadOnly Property SecurityKey
如何...
Public Sub DoWork()
Dim test as String = Me.SecurityKey
End Sub
如果在非實例方法中不能使用Me.
,那麼如何使用Shared
方法中的基類的屬性/函數?VB.NET和OOP - 共享方法和基本屬性
例如,來自ClassA
ClassB
ClassB
繼承具有Shared Method DoWork()
; ClassA
有ReadOnly Property SecurityKey
如何...
Public Sub DoWork()
Dim test as String = Me.SecurityKey
End Sub
如果你不能用 「我」。在非實例方法中,您將如何使用Shared方法中的基類的屬性/函數?
你不行。共享方法(和C#中的static
)不能與OOP一起使用。這個(即靜態/共享方法不能被虛擬/可重寫的事實)是.NET系統中「從Java繼承」的設計缺陷。共享方法實際上不是對象方法,而是具有名稱範圍的全局方法。
此外,甚至可能與您的問題更相關,您總是需要一個實例來訪問非共享方法(它被共享,不屬於任何特定實例)。
如果您在靜態情況下的時候,你需要實例化這個類來訪問它的實例成員。
您可以通過類名訪問共享成員,而不是實例標識符。IE:ClassA.DoWork()
您不能從共享方法/成員訪問實例成員,因爲它們是不同的作用域。但是,您可以從實例作用域訪問共享成員,而無需使用實例標識符。
嘗試將類的實例傳遞給您的方法或在共享方法中實例化類。
Public Shared Sub DoWork(instance As ClassB)
Dim test As String = instance.WhateverProperty;
End Sub
我注意到如果我標記我的屬性在ClassA中共享,我可以使用它...但仍然不能使用前綴「我」。有沒有使用前綴/關鍵字?一些視覺提示/提示,這可以因爲我繼承的類嗎? – BuddyJoe 2009-02-25 18:23:59
不,您可以使用類資源管理器來幫助您看到類的不同成員具有的修飾符,但是您將無法訪問具有像Me/this這樣的實例標識符的對象的共享/靜態成員。要記住的最好方法是,如果它被標記爲共享,那麼它總是ClassName.XXX – 2009-02-25 18:27:32
使用你的例子:
哪個ClassA
實例應該當它試圖共享ClassB.DoWork()
GET引用Me.SecurityKey
財產?
如果你讓ClassA.SecurityKey
屬性也被共享,那會更有意義,但是繼承關係不再重要。你也可以在該方法中說ClassA.SecurityKey
,因爲無論如何你必須已經知道ClassA才能知道它的繼承屬性。
如果您將ClassB.DoWork()
作爲實例方法而不是共享方法,則可以使用VB.Net中的MyBase
關鍵字來引用繼承的ClassA屬性,即使ClassB重載或遮蔽它。
Dim s as SecKey = ClassA.SecurityKey
這從共享方法拉。請記住,共享方法由類的所有實例共享,因此您可以使用類名來提取它們。
不幸的是,我試圖幫助一些修復由完全非OOP人寫的VB.NET混亂。我正在試圖通過一些OOP來清理混亂。我認爲這個人使用他的「B類」中的Shared方法來處理ASP.NET中的Object DataSources ...我不會使用那些 – BuddyJoe 2009-02-25 18:37:05