VB.Net的MyClass關鍵字有什麼實際用途?VB.Net中的MyClass
我瞭解technical usage of MyClass;我不明白它在現實世界中的實際用法。
如果您有任何虛擬(可重寫)成員,則只有使用MyClass纔有意義。但是這也意味着你想忽略子類中的重載實現。這似乎是自相矛盾的。
我可以想到一些人爲的例子,但它們只是糟糕的設計而不是實際的用法。
VB.Net的MyClass關鍵字有什麼實際用途?VB.Net中的MyClass
我瞭解technical usage of MyClass;我不明白它在現實世界中的實際用法。
如果您有任何虛擬(可重寫)成員,則只有使用MyClass纔有意義。但是這也意味着你想忽略子類中的重載實現。這似乎是自相矛盾的。
我可以想到一些人爲的例子,但它們只是糟糕的設計而不是實際的用法。
MyClass
,從編譯器的角度來看,是省略贊成call
指令的指令callvirt
的方式。基本上,當你用虛擬語義(callvirt
)調用一個方法時,你表示你想要使用派生最多的變體。在您希望省略使用MyClass
(call
)的衍生變體的情況下。雖然你已經說明你理解了基本概念,但我認爲它可能有助於從功能的角度來描述它,而不是暗含的理解。它的功能與MyBase
完全相同,注意事項是基本類型爲MyBase
,而不是使用MyClass
的活動類型。
覆蓋層次結構中當前點的虛擬調用語義通常是一個糟糕的設計選擇,它唯一有效的時間是您必須依賴對象層次結構中的特定功能塊,而不能依靠繼承者在實現中通過基調用來調用變體。它也可以依靠你作爲設計者,決定它是唯一的替代品,因爲你在對象層次結構中進一步覆蓋了功能,並且必須確保在這個角落案例中,在繼承樹的當前級別這個特定方法必須是調用。
這是關於設計,瞭解整體設計和角落案例。可能有一個原因C ♯不包括這樣的功能,因爲在這些角落的情況下,您可以將該方法分離爲層次結構中當前級別的私有變體,並在必要時引用該私有實現。我個人認爲,利用分割方法是達到目標的理想手段,因爲它明確了您的設計選擇,並且更易於遵循(並且它也是唯一的功能意味着沒有與MyClass
等效的語言。)
我想唯一的情況下,我可以看到它的用途,將是如果你想要的基礎條件,並在同一時間繼承的條件? I.E.您希望能夠繼承成員的位置,但是您希望能夠訪問未被繼承更改的成員的值?
那麼爲什麼讓這個成員首先被覆蓋呢? – 2008-10-10 13:37:16
多態性
對不起,我沒有一個明確的代碼示例在這裏,但你可以按照下面的鏈接,我討厭複製MSDN庫的描述,但它是如此之好,這真的很難重寫它更清晰。
「MyClass提供了一種方法來引用當前類實例成員,而不會被任何派生類覆蓋所替代。MyClass關鍵字的行爲就像一個對象變量,它引用當前實例的類實例。
另請注意,您不能在共享方法中使用MyClass。
通過MyClass的實現多態性的一個很好的例子是在http://www.devarticles.com/c/a/VB.Net/Implementing-Polymorphism-in-VB.Net/
您引用了「MyClass提供了一種方法來引用當前類實例成員,而不會被任何派生類覆蓋替換它們。」 那麼爲什麼要把你的成員標記爲可覆蓋呢? – 2008-10-05 15:17:20
你需要它,如果你想調用鏈構造。
Public Sub New(ByVal accountKey As Integer)
MyClass.New(accountKey, Nothing)
End Sub
Public Sub New(ByVal accountKey As Integer, ByVal accountName As String)
MyClass.New(accountKey, accountName, Nothing)
End Sub
Public Sub New(ByVal accountKey As Integer, ByVal accountName As String, ByVal accountNumber As String)
m_AccountKey = accountKey
m_AccountName = accountName
m_AccountNumber = accountNumber
End Sub
不是; Me.New(...)或MyBase.New(...)將工作得很好。 – 2008-10-05 15:14:40
感謝您回答我5年前的問題:)我認爲「糟糕的設計選擇」是答案;私密/公開虛擬似乎好多了。 – 2013-10-01 15:57:08