Vb.net 我可以重写接口属性吗?

Vb.net 我可以重写接口属性吗?,vb.net,properties,interface,overriding,implementation,Vb.net,Properties,Interface,Overriding,Implementation,Shell示例如下。基本上,我需要一个客户机和一名员工从IPerson实现SSN属性。然而,我希望客户机有get和set(这不是问题),但我希望员工只有get Public Interface IPerson Property SSN As String End Interface Public Class Client Implements IPerson Public Property SSN As String Implements AELName.IPerson

Shell示例如下。基本上,我需要一个客户机和一名员工从IPerson实现SSN属性。然而,我希望客户机有get和set(这不是问题),但我希望员工只有get

Public Interface IPerson
    Property SSN As String
End Interface

Public Class Client
    Implements IPerson
    Public Property SSN As String Implements AELName.IPerson.SSN
        Get
            Return _SSN
        End Get
        Set(value As String)
            _SSN = value
        End Set
    End Property
End Class

Public Class Employee
    Implements IPerson
    Public Readonly Property SSN As String Implements AELName.IPerson.SSN
        Get
            Return _SSN
        End Get
    End Property
End Class

员工生成错误“'SSN'无法实现'SSN',因为接口'IPerson'上没有匹配的属性”。是否有一种简单的方法可以覆盖员工的SSN实现?

您可以实现一个空的
集合
——一个不更新任何内容的集合

Public Class Employee
    Implements IPerson
    Public Readonly Property SSN As String Implements AELName.IPerson.SSN
        Get
            Return _SSN
        End Get
        Set
            ' Make read only for Employee
        End Set
    End Property
End Class

我建议将接口分为IReadablePerson和IReadWritePerson,后者继承前者。请注意,前一个接口不是
IImmutablePerson
,因为后一个名称会向类的使用者暗示,他们不应该期望其任何属性发生更改;实现
IReadWritePerson
的对象不会遵守这种期望,但会遵守人应该可读的期望

拆分接口的一个小麻烦是,
IReadWritePerson
必须在其读/写属性声明中包含修饰符
阴影
IReadWritePerson
的实现者必须提供
IReadablePerson
的只读实现和
IReadWritePerson
的读写实现。在C#中,读写属性的公共实现可以自动为任何类似命名的只读、只读或读写属性生成实现,这些属性是类实现的任何接口的一部分,但是当显式声明要实现的接口时,接口的样式(只读、只读、读写)必须与实现的精确匹配。令人讨厌


更令人烦恼的是,不能简单地用只读属性声明
IReadableFoo
,用只读属性声明
IWriteOnlyFoo
,并让
IReadWriteFoo
简单地继承这两个属性。如果一个接口实现了一个只读属性和一个同名的只读属性,那么这两个属性都不是y将是可用的,因为编译器将在诸如
somevariable=object.someProperty
someObject.someProperty=somevariable
之类的语句中声明它是“不明确的”要使用哪个实现。这并不是说我看不出任何歧义——我看不出第一个实现如何使用除getter之外的任何东西,或者后一个实现如何使用除setter之外的任何东西,但编译器无法解决它。

回答您的标题问题“我可以重写接口属性吗”…当然可以。下面是一个如何实现的示例。只需将Overridable关键字添加到基本具体实现中即可。我知道这并不能解决将属性更改为只读的问题,但我想我应该指出,重写接口的基类具体实现是可能的

Module Module1

    Sub Main()

        Dim iEntity As IEntity = New MyEntity

        iEntity.SetMessage(iEntity)

        Console.WriteLine(iEntity.Message)

        Console.ReadKey()

    End Sub

End Module

Public Interface IEntity

    Property Message As String

    Sub SetMessage(entity As IEntity)

End Interface


Public Class MyEntity
    Inherits BaseEntity

    Public Overrides Property Message As String
        Get
            Return String.Format("{0}.. and overroad.", MyBase.Message)
        End Get
        Set(value As String)
            MyBase.Message = value
        End Set
    End Property

    Public Overrides Sub SetMessage(entity As IEntity)

        Me.Message = "I was set from MyEntity."

    End Sub

End Class


Public Class BaseEntity
    Implements IEntity

    Public Overridable Property Message As String Implements IEntity.Message

    Public Overridable Sub SetMessage(entity As IEntity) Implements IEntity.SetMessage
        Me.Message = "I was set from BaseEntity."
    End Sub

End Class

当我回到它的时候,我会尝试这个,但是任何使用Employee类的东西都不会仍然有对SSN的写入权限,它只是不会在幕后设置任何东西?我希望如果未来的开发人员尝试在一个雇员身上设置SSN,它会引发一个错误。@Curtis-是的,这将无声地失败。但是你可以抛出一个异常。Excel抛出异常的解决方案。@Curtis:谢谢。我又添加了几段供您阅读。