2009-02-05 63 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