Dopo la limitazione Setter ambito di applicazione e quindi l'applicazione di un'interfaccia, la portata non è presa in considerazione!

StackOverflow https://stackoverflow.com/questions/517049

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.

È stato utile?

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!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top