Si je mets une portée au niveau de l'ami sur un poseur, comme ça ...Après avoir restreint la portée de Setter, puis appliqué une interface, la portée n'est pas prise en compte!
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
... Et puis appelez d'un autre projet, il fonctionne correctement. Je ne peux pas faire quelque chose comme MyClass.IsDirty = True.
Parfait! C'est exactement ce que je veux.
Mais maintenant, si je définir une interface, et je ferai bien de le faire:
Public Interface IMyClass
Property IsDirty() As Boolean
End Interface
je peux faire quelque chose comme:
Dim MyInstance as IMyClass= GetSomeInstanceOfMyClass()
MyInstance.IsDirty=True
... Et, bizarrement, il fonctionne! Aucune exception n'est levée et la variable interne est définie sur True. Il ignore complètement la portée de l'ami!
C'est hideux. Qu'est-ce que je rate?? J'ai besoin de cela parce que je suis en train de concevoir une API, et je veux que l'API interne puisse définir IsDirty, mais les développeurs finaux ne devraient pas être capables de le faire. Actuellement, j'emballe toute la classe dans une façade pour obtenir cette fonctionnalité, mais la façade ne devrait pas être nécessaire.
Malédictions! Alors qu'est-ce que vous faites ici, enveloppez la classe dans une structure de style de façade et présentez cela au développeur final, tout en gardant la classe "normale" à usage interne? –
Je ferais probablement la propriété ReadOnly comme le suggère nobugz, puis ajouterai un Friend Sub SetIsDirty (ByVal isDirty As Boolean) pour l'utilisation interne de l'API. – chyne
BTW, déclarant que la propriété ReadOnly dans l'interface ne fonctionne pas, au moins dans VB. Il ne voit pas la propriété read/write sur la classe comme une correspondance. :/C'est l'une des parties les plus laides du cadre que j'ai rencontré. –