2009-02-05 118 views
0

如果我設置朋友級別範圍上的二傳手,像這樣...限制Setter範圍並應用接口後,範圍被忽略!

Public Class MyClass 
    Public Property IsDirty() As Boolean 
     Get 
      Return _isDirty 
     End Get 
     Friend Set(ByVal trueFalse As Boolean) 
      _isDirty = trueFalse 
     End Set 
    End Property 
End Class 

...,然後從另一個項目中調用它,它工作正常。我無法做類似MyClass.IsDirty = True的事情。

太棒了!這正是我想要的。

但現在,如果我定義一個接口,而我確實將不得不這樣做:

Public Interface IMyClass 
    Property IsDirty() As Boolean 
End Interface 

我可以這樣做:

Dim MyInstance as IMyClass= GetSomeInstanceOfMyClass() 
MyInstance.IsDirty=True 

...而且,奇怪的是,它跑!不引發異常,並且內部變量設置爲True。它完全忽略了Friend範圍!

這很可怕。我在想什麼?

注意:我需要這個,因爲我設計了一個API,並且我希望內部API能夠設置IsDirty,但是最終開發人員不應該能夠進入。目前,我正在將整個班級包裝在外觀中以獲得此功能,但外觀應該是不必要的。

回答

1

接口方法總是具有公共可訪問性。你不能通過明確的接口實現來解決這個問題,那隻會隱藏類方法。只需將該對象轉換爲接口類型即可再次進行無限制的訪問。

編輯:實際上,問題很容易解決。只要財產申報只讀在接口聲明:)

例如:

Public Interface IMyClass 
    ReadOnly Property IsDirty() As Boolean 
End Interface 

Public Class Test 
    Implements IMyClass 
    Private mIsDirty As Boolean 
    Private ReadOnly Property IsDirtyImpl() As Boolean Implements IMyClass.IsDirty 
     Get 
      Return mIsDirty 
     End Get 
    End Property 
    Public Property IsDirty() As Boolean 
     Get 
      Return mIsDirty 
     End Get 
     Friend Set(ByVal value As Boolean) 
      mIsDirty = value 
     End Set 
    End Property 
End Class 
+0

詛咒!那麼你在這裏做什麼,將這個類封裝在一個門面風格的結構中,並將其呈現給最終開發人員,同時保持「正常」類用於內部使用? – 2009-02-05 20:24:58

1

你缺少的是隱式和顯式接口實現的概念。見the answer to this question for more details

如果你認爲它與朋友二傳手很可怕,請嘗試將其設置爲私人,並觀看它仍然可以通過界面訪問!

+0

我做到了。 :)當朋友沒有工作,我把它設置爲私人。我以爲我的頭會爆炸。謝謝您的幫助。 – 2009-02-05 20:19:47