VB.Net接口中的可选只读属性

VB.Net接口中的可选只读属性,vb.net,interface,properties,readonly,optional,Vb.net,Interface,Properties,Readonly,Optional,我试图开发一个简单的接口,允许从类生成快速列表。基本上,接口需要返回ID和名称。但是,有些类具有只读的计算名称属性,而其他类仅使用读/写名称属性。基本上,我所关心的只是它有一个getter,不管属性是否有setter。我如何编写这个接口来处理或不抛出编译错误 我读过,并没有真正理解它,也许我只是很笨。如果是这样的话,请告诉我我的方法的错误:)看起来另一个问题的答案会起作用:下面是一个示例: Public Interface IReadOnly ReadOnly Property Name

我试图开发一个简单的接口,允许从类生成快速列表。基本上,接口需要返回ID和名称。但是,有些类具有只读的计算名称属性,而其他类仅使用读/写名称属性。基本上,我所关心的只是它有一个getter,不管属性是否有setter。我如何编写这个接口来处理或不抛出编译错误


我读过,并没有真正理解它,也许我只是很笨。如果是这样的话,请告诉我我的方法的错误:)

看起来另一个问题的答案会起作用:下面是一个示例:

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

上述方法实际上会导致实现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

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

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

由于
IReadWrite
实现了
IReadOnly
IReadWrite
被称为
IReadOnly
的“子类”(虽然“子类”更准确地用于描述继承基类而不是实现接口的类——为了简单起见,它们的概念几乎相同)。如果
IReadWrite
IReadOnly
的一个子类,则反之亦然--
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
公共子方法()
dim readOnlyInstance as IREADOLY=新建读写类()
Console.WriteLine(readOnlyInstance.Name)
'由于我们正在作为IReadOnly的实例与ReadWriteClass通信,因此无法编译下面的行
'readOnlyInstance.Name=“圣诞老人条款”
'在这里,我们向下转换变量,通过它的另一个接口IReadWrite引用它
dim readWriteInstance=DirectCast(只读状态,IReadWrite)
'现在我们可以获取和设置Name的值
readWriteInstance.Name=“John Doe”
Console.WriteLine(readWriteInstance.Name)
'注意,在上面的示例中,我们创建了ReadWriteClass的*one*实例
'并为同一基础对象提供了两个变量/引用。

Console.WriteLine(readOnlyInstance.Name)“@foson:whoops!让我重写一下:)谢谢你的代码,对不起,我回来晚了。作为一个新手,你能给我举个例子,说明什么时候以及如何实施下推吗?这对我来说是个新鲜事。谢谢。用一个例子展开。你应该读一些关于铸造的书;阅读有关
CType()
DirectCast()
TryCast()
的MSDN文章和其他问题。这些内容非常详细,非常有用。非常感谢。