If an interface defines a ReadOnly Property, how can an implementer provide the Setter to this property?

前端 未结 5 1089
北恋
北恋 2021-01-18 04:51

Is there a way for implementers of an interface where a ReadOnly property is defined to make it a complete Read/Write Property ?

相关标签:
5条回答
  • 2021-01-18 04:59

    In Visual Basic, when you implement a method or property from an interface, you can change its name and its visibility. You can leverage that capability to handle the case you are asking about. Prior to Visual Studio 2015, I often did this:

    Interface:

    Public Interface SomeInterface
        ReadOnly Property SomeProperty As String
    End Interface
    

    Implementing Class:

    Public Class SomeClass
        Implements SomeInterface
    
        Public Property SomeProperty As String
        Private ReadOnly Property SomeProperty_ReadOnly As String Implements SomeInterface.SomeProperty
            Get
                Return Me.SomeProperty
            End Get
        End Property
    End Class
    

    The result is that SomeProperty is read-only when accessed through SomeInterface, but read-write when accessed through SomeClass:

    Dim c As New SomeClass
    c.SomeProperty = "hello" 'Write via class OK
    Dim s1 = c.SomeProperty 'Read via class OK
    
    Dim i As SomeInterface = c
    Dim s2 = i.SomeProperty 'Read via interface OK
    i.SomeProperty = "greetings" 'Syntax Error, interface property is read-only
    
    0 讨论(0)
  • 2021-01-18 05:03

    Now supported in Visual Studio 2015.

    What's New for Visual Basic

    Readonly Interface Properties

    You can implement readonly interface properties using a readwrite property. The interface guarantees minimum functionality, and it does not stop an implementing class from allowing the property to be set.

    0 讨论(0)
  • 2021-01-18 05:07

    You can't do it as the interface requires that you implement a ReadOnly Property.

    Properties don't allow overloading so there is no way to implement a non-ReadOnly and also a ReadOnly.

    I would suggest you either implement a Custom Setter or drop the ReadOnly from the Interface.

    Without details of why you want to do this it is hard to suggest the best solution

    0 讨论(0)
  • 2021-01-18 05:13

    There is nothing at a CLI level which prevents this type of implementation and as you've demonstrated it's already supported by C#. The VB.Net language just doesn't support this style of implementation.

    Knowing why though is a bit tough since the decision is almost 10 years removed at this point. Very likely it was just an over site at the time interface implementation was designed.

    0 讨论(0)
  • 2021-01-18 05:22

    In the end, I ended up with a solution that matches my goal :

    • users that access via the Interface see at least a getter
    • users that access the implementation can Read and Write.

    I did this "shadowing" the implemented property like this :

    'users who access through interface see only the Read accessor
    Public ReadOnly Property PublicProperty_SomeInterface As String Implements SomeInterface.PublicProperty
        Get
            Return _myProperty
        End Get
    End Property
    
    
    'users who work with the implementation have Read/Write access
    Public Property PublicProperty_SomeInterface As String
        Get
            Return _myProperty
        End Get
        Set(ByVal value As String)
            _myProperty = value
        End Set
    End Property
    

    Then, depending on how you use it, you can do :

    Dim implementorAsInterface As SomeInterface = New InterfaceImplementor()
    logger.Log(implementor.PublicProperty) 'read access is always ok
    implementor.PublicProperty = "toto" 'compile error : readOnly access
    
    Dim implementor As InterfaceImplementor = New InterfaceImplementor()
    implementor.PublicProperty = "toto" 'write access
    
    0 讨论(0)
提交回复
热议问题