gpt4 book ai didi

c# - VB.Net 中的 Protected Set 用于接口(interface)中定义的属性

转载 作者:太空狗 更新时间:2023-10-29 22:55:55 26 4
gpt4 key购买 nike

我们有一个界面,可以粗略地简化为:

public interface IPersistable<T>
{
T Id { get; }
}

大多数实现接口(interface)的地方都希望拥有它,以便在该属性上有一个 protected 或私有(private)的集合,即在 C# 中:

public class Foo : IPersistable<int>
{
public int Id { get; protected set; }
}

但是,我无法获得任何示例 VB.Net 代码以遵循相同的模式进行编译,同时仍然实现接口(interface),因此:

Public Class Foo
Implements IPersistable(Of Integer)

Public Property Id() As Integer Implements IPersistable(Of Integer).Id
Get
Throw New NotImplementedException()
End Get
Protected Set(ByVal value As Integer)
Throw New NotImplementedException()
End Set
End Property
End Class

...不会编译,但这会:

Public Class Foo
Public Property Id() As Integer
Get
Throw New NotImplementedException()
End Get
Protected Set(ByVal value As Integer)
Throw New NotImplementedException()
End Set
End Property
End Class

我很欣赏这个例子过于琐碎,通过 protected 构造函数可能会更好地实现,但我很想知道它是否可以通过这种方式完成?

[编辑:]...显然,如果一个类型想要使用 XMLSerialization,那么属性将需要是公共(public)读/写的,或者类型将需要为每个类型编写自定义序列化程序。

本质上,我认为接口(interface)应该定义最小可访问性,但 VB 将其解释为准确的可访问性?

最佳答案

是的,您必须按字面意思实现接口(interface)。一种可能的解决方法是使用另一个名称重新发布类中的属性:

Public Class Foo
Implements IPersistable(Of Integer)
Private m_Id As Integer

Public ReadOnly Property Id() As Integer Implements IPersistable(Of Integer).Id
Get
Return m_Id
End Get
End Property

Protected Property IdInternal() As Integer
Get
Return m_Id
End Get
Set(ByVal value As Integer)
m_Id = value
End Set
End Property
End Class

如果您打算在派生类中覆盖它,请声明属性可覆盖。

关于c# - VB.Net 中的 Protected Set 用于接口(interface)中定义的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2362381/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com