我想编写一组 C# 记录类,它们本身提供不可变和可变版本。
这类似于 c# 中提供的 List 和 ReadOnlyList (是的,可以说不太安全,因为调用者仍然可以转换为可变版本,但我对此表示同意,这不是我问题的核心)
到目前为止,我在尝试过的实现中遇到了一些问题:
通过接口实现
public record class MutableRecord : IReadOnlyRecord
{
public int ValueTypeProperty { get; set; }
// This is is one problem. In the Mutable Record I would like to expose the Mutable
// version of the other record type. As opposed to the readonly interface.
// public OtherMutableRecord RefernceTypeProperty { get; set; }
public IReadOnlyRecord RefernceTypeProperty { get; set; }
}
public interface IReadOnlyOtherRecord
{
int SomeData { get; }
}
public record class OtherMutableRecord : IReadOnlyOtherRecord
{
public int SomeData { get; set; }
}
使用基类实现
我尝试将上述接口替换为基类,然后使用 new 关键字来实现实现隐藏。但是c#不允许多重继承。在许多情况下,我有需要从 ReadOnlyBase 类和其他基类派生的类(用于代码中的其他操作,例如在列表中存储常见对象)。因此,理想情况下,接口实现是最好的,但我无法绕过需要特定类型的接口。
您可以使用显式接口实现来根据引用类型公开不同的属性或访问级别:
public record class MutableRecord : IReadOnlyRecord
{
public int ValueTypeProperty { get; set; }
IReadOnlyOtherRecord IReadOnlyRecord.RefernceTypeProperty => ReferenceTypeProperty;
public OtherMutableRecord ReferenceTypeProperty { get; set;}
}
请注意,“不可变”和“只读”的含义略有不同。前者意味着该对象永远不会改变,而后者意味着你无法改变它。