Dopo la limitazione Setter ambito di applicazione e quindi l'applicazione di un'interfaccia, la portata non è presa in considerazione!
Domanda
Se ho un Amico a livello di ambito di un setter, come questo...
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
...E poi chiamare da un altro progetto, funziona correttamente.Io non riesco a fare qualcosa di simile MyClass.IsDirty = True.
Grande!Che è esattamente quello che voglio.
Ma ora posso definire un'interfaccia, e io, infatti, hanno a che fare:
Public Interface IMyClass
Property IsDirty() As Boolean
End Interface
Posso fare qualcosa di simile:
Dim MyInstance as IMyClass= GetSomeInstanceOfMyClass()
MyInstance.IsDirty=True
...E, stranamente, funziona! Non vengono generate eccezioni, e l'interno della variabile è impostata a True.Ignora l'Amico ambito completamente!
Che orribile.Che cosa mi manca??
Nota: Ho bisogno di questo, perché io sto progettando un API, e voglio interna API per essere in grado di impostare IsDirty, ma alla fine-gli sviluppatori non dovrebbero essere in grado di entrare in quella.Attualmente sto avvolgendo tutta la classe in una facciata per ottenere questa funzionalità, ma la facciata dovrebbe essere inutili.
Soluzione
I metodi di interfaccia hanno sempre accessibilità al pubblico. Non si può risolvere che entro implementazione dell'interfaccia esplicita, che sarà solo nascondere il metodo della classe. Basta lanciare l'oggetto per il tipo di interfaccia dà di nuovo libero accesso.
EDIT: in realtà, il problema è di facile soluzione. Basta dichiarare la proprietà ReadOnly nella dichiarazione di interfaccia:)
Ad esempio:
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
Altri suggerimenti
Quello che vi manca è il concetto di inplicit e implementazione di interfaccia esplicita.Vedere la risposta a questa domanda per ulteriori dettagli.
E se si pensa che è orribile con un Amico setter, provare a impostare per Privati e guardare ancora essere accessibile tramite l'interfaccia!