正确封装 base class 的 属性 setter

Encapsulating correctly the property setter of base class

我对在基础 class 中封装属性 setter 有点困惑。

为了更清楚,这里有一个具体的例子:

public abstract class Records
{
    public string Date { get; protected set; }
    public string Source { get; protected set; }
    public string Type { get; protected set; }
    public int Value { get; protected set; }

    protected Records(string type, string source, int value)
    {
        Type = type;
        Source = source;
        Value = value;
        Date = DateTime.Now.ToString("hh.mm.ss.ffffff");
    }
}

public class NewDocumentRecord : Records
{
    public NewDocumentRecord(string source, int value)
        : base(ContentTypesString.DocumentNew, source, value)
    {
        Source = source;
        Value = value;
    }
}

一般来说,很难在基数 class 中找到受保护的 setter:如果 属性 属于基数 class,则控制它的逻辑也属于基础 class。

Supposing some of those properties are set in base constructor, the setter should be private or protected?

假设 属性 在构造函数中设置一次,并且再也不会更改,setter 应该是私有的,或者根本不应该有 setter (C# 6或更高版本)。

public string Date { get; }

Supposing some of those properties are set in child constructor, the setter should be private or protected?

如果 属性 在基 class 中声明,设置其初始值的任务也应该是基 class 构造函数的一部分。最好的做法是将值从子构造函数传递给基构造函数,让它在将值设置到 属性.

之前验证数据

这并不意味着您不应该让子classes 修改基class 中声明的属性,只是您应该避免使自动生成的setters 受到保护。如果您需要使 属性 只能由 subclasses 修改,请为他们提供一个受保护的方法来这样做。

如果您只想在基础 class 中设置 属性 并从 children classes 中隐藏它,您应该将 setter 设为私有。

如果你只想在 base ahd children classes 中设置值,你应该将其保护起来。