VB.Net接口中的可选Readonly属性

Jos*_*ier 3 vb.net properties interface readonly optional

我正在尝试开发一个简单的接口,允许从类生成快速列表.基本上,接口需要返回ID和名称.但是,某些类具有计算名称属性,该属性是只读的,其他类只使用读/写名称属性.基本上,我所关心的只是它有一个吸气剂,如果财产有一个二传手就没关系.如何编写此接口来处理或不抛出编译错误?

我已经读过这个问题并没有真正遵循它,也许我只是密集.如果是这样,请告诉我我的方式的错误:)

STW*_*STW 5

看起来其他问题的答案将起作用:这是一个示例:

Public Interface IReadOnly
    ReadOnly Property Name() As String
End Interface

Public Interface IReadWrite
    Inherits IReadOnly

    Overloads Property Name() As String

End Interface

Public Class ReadOnlyClass
    Implements IReadOnly

    Private _Name
    Public ReadOnly Property Name() As String Implements IReadOnly.Name
        Get
            Return _Name
        End Get
    End Property
End Class

Public Class ReadWriteClass
    Implements IReadWrite

    Private ReadOnly Property ReadOnly_Name() As String Implements IReadOnly.Name
        Get
            Return Name
        End Get
    End Property

    Private _Name As String
    Public Overloads Property Name() As String Implements IReadWrite.Name
        Get
            Return _Name
        End Get
        Set(ByVal value As String)
            _Name = value
        End Set
    End Property
End Class
Run Code Online (Sandbox Code Playgroud)

上面的方法实际上会导致实现IReadWrite的类也实现IReadOnly - 所以你实际上需要向下转换为IReadWrite才能设置属性.

另一种方法,它避免了这个问题,但在实现类和调用者中需要更多的逻辑,如下所示:

Public Interface ISometimesWritable
    Property Name() As String
    ReadOnly Property AllowNameEdit() As Boolean
End Interface

Public Class ReadOnlyClass
    Implements ISometimesWritable

    Public ReadOnly Property AllowNameEdit() As Boolean Implements ISometimesWritable.AllowNameEdit
        Get
            Return False
        End Get
    End Property

    Private _Name As String
    Public Property Name() As String Implements ISometimesWritable.Name
        Get
            Return _Name
        End Get
        Set(ByVal value As String)
            Throw New NotSupportedException("Name cannot be set when AllowNameEdit is False")
        End Set
    End Property
End Class

Public Class ReadWriteClass
    Implements ISometimesWritable

    Public ReadOnly Property AllowNameEdit() As Boolean Implements ISometimesWritable.AllowNameEdit
        Get
            Return True
        End Get
    End Property

    Private _Name As String
    Public Property Name() As String Implements ISometimesWritable.Name
        Get
            Return _Name
        End Get
        Set(ByVal value As String)
            _Name = value
        End Set
    End Property
End Class
Run Code Online (Sandbox Code Playgroud)

更新: 回答有关向下转换的问题; "向下转换"是一个术语,用于描述将对象从超类,接口或抽象基类Type转换为更具体的类Type.

例如,上面的第一个示例定义了两个接口:IReadOnlyIReadWrite.您会注意到IReadWriteimplements IReadOnly,这意味着您可以同时执行IReadWrite IReadOnly调用实现的对象IReadWrite.

由于IReadWriteimplements IReadOnly,IReadWrite被称为"子类" IReadOnly(虽然"子类"更准确地用来描述一个继承基类的类,而不是实现一个接口 - 为了简单起见它们非常几乎相同的概念).如果IReadWrite是一个子类的IReadOnly,然后逆是true-- IReadOnly超一流IReadWrite.

例如,我可以描述一个实例ReadWriteClass作为任一接口的实现:

Public Sub SomeMethod()
    dim readOnlyInstance as IReadOnly = new ReadWriteClass()
    Console.WriteLine(readOnlyInstance.Name)

    ' The following line won't compile, since we're communicating with ReadWriteClass as an instance of IReadOnly
    'readOnlyInstance.Name = "Santa Clause"

    ' Here we downcast the variable to reference it by it's other interface, IReadWrite
    dim readWriteInstance = DirectCast(readOnlyInstance, IReadWrite)

    ' Now we can both Get and Set the value of Name
    readWriteInstance.Name = "John Doe"
    Console.WriteLine(readWriteInstance.Name)

    ' Note that in the above example we created *one* instance of ReadWriteClass
    ' and have provided two variables / references to the same underlying object.
    Console.WriteLine(readOnlyInstance.Name) ' <-- note that this should return "John Doe"

End Sub
Run Code Online (Sandbox Code Playgroud)