2011-04-12 69 views
4

爲什麼不能實現一個接口並同時處理事件?爲什麼不能實現一個接口並同時處理事件?

下面給我的語法錯誤:

Sub MySub() Handles MyButton.Click Implements MyInterface.MyMethod 
End Sub 

我知道我能勝任這樣的邏輯有另一種方法,但這不是重點。我只是想了解這背後的推理。

+1

.NET的大多數編碼約定規定接口應該以大寫字母「I」作爲前綴以表明它們是接口(並幫助將它們與類區分開來)。所以,你的界面實際上被稱爲'IMyInterface'。 – 2011-04-12 15:33:12

+0

當然,但那不是重點:) – codymanix 2011-04-12 15:38:51

回答

4

的語法錯誤是與語言的語法一致,在VB語言規範的§ 9.2.1:

SubDeclaration ::=
[ Attributes ] [ ProcedureModifier+ ] SubSignature [ HandlesOrImplements ] LineTerminator
Block
End Sub StatementTerminator

HandlesOrImplements ::= HandlesClause | ImplementsClause

所以只有一個是支持任何一種方法。該規範沒有(快速查看)包括這個限制的基本原理。爲此,您需要與Microsoft的VB語言設計團隊成員交談。


這是包含下<VSRoot> \ VB \規格VS的安裝\ 1033。

3

我從來沒有見過任何關於的詳細討論爲什麼這個決定是由VB.NET團隊做出的,但說實話,我很難從OOP設計的角度來看這是如何產生任何意義的。事件處理程序方法通常不應該做任何工作。相反,他們應該呼籲其他做繁重的方法。他們呼籲的另一種方法是實現您的界面。

但是,如果你做這樣的事情它肯定是可以實現的:

Public MustInherit Class MyParentClass 
    Protected WithEvents MyButton As Button 

    Protected MustOverride Sub MySub() Handles MyButton.Click 
End Class 

Public Class MyDerivedClass : Inherits MyParentClass : Implements IMyInterface 
    Protected Overrides Sub MySub() Implements IMyInterface.MyMethod 
     ' Do something here... 
    End Sub 
End Class 

還記得,事件處理方法通常有一個獨特的簽名;是這樣的:

Public Sub MySub(ByVal sender As System.Object, ByVal e As System.EventArgs) 

這是另一個原因爲什麼它會是極其罕見的事件處理方法能夠實現接口中定義的方法。

+0

不清楚你得到什麼「事件處理程序方法通常不應該做任何工作。」從。但是,一個簡單的轉發方法將被內聯(除非調試設置)。 – Richard 2011-04-12 15:35:09

+0

我不想粗魯,但我明確表示我不希望對代碼示例有任何意見,但我想了解這裏的微軟推理。 – codymanix 2011-04-12 15:41:20

+1

@Richard:嗯,這是一個很常見的設計原則。我聽說它以各種理由在各地傳播。然而,基本的一點是,在你的事件處理器方法中放置大量的實現代碼將代碼與UI緊密地聯繫起來。由於*這通常被認爲是不好的做法,所以說事件處理程序應該調用包含邏輯或算法的其他方法並不是什麼大不了的事。 – 2011-04-12 15:43:15

相關問題