我对基类中属性setter的封装有点困惑。
假设其中一些属性是在 base 构造函数中设置的,那么setter应该是私有的还是受保护的?
假设其中一些属性是在子构造函数中设置的,那么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;
}
}
答案 0 :(得分:1)
通常,很难为基类中的受保护的setter创建一个案例:如果属性属于基类,那么控制它的逻辑也属于基类。
假设其中一些属性是在基础构造函数中设置的,那么setter应该是private还是protected?
假设属性在构造函数中设置了一次,并且永远不会再次更改,则setter应该是私有的,或者根本不应该有setter(C#6或更高版本)。
public string Date { get; }
假设其中一些属性是在子构造函数中设置的,那么setter应该是private还是protected?
如果在基类中声明属性,则设置其初始值的任务也应该是基类构造函数的一部分。最好的做法是将值从子构造函数传递给基础构造函数,让它在将值设置到属性之前验证数据。
这并不意味着您永远不应该让子类修改基类中声明的属性,只是应该避免使自动生成的setter受到保护。如果您只需要通过子类创建一个可修改的属性,请为它们提供一个受保护的方法。
答案 1 :(得分:1)
如果您只想在基类中设置属性并将其隐藏在子类中,则应将setter设为私有。
如果你只想在基础ahd子类中设置值,你应该保护它。