正确封装基类的属性setter

时间:2017-04-10 09:28:10

标签: c# oop properties encapsulation

我对基类中属性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;
    }
}

2 个答案:

答案 0 :(得分:1)

通常,很难为基类中的受保护的setter创建一个案例:如果属性属于基类,那么控制它的逻辑也属于基类。

  

假设其中一些属性是在基础构造函数中设置的,那么setter应该是private还是protected?

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

public string Date { get; }
  

假设其中一些属性是在子构造函数中设置的,那么setter应该是private还是protected?

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

这并不意味着您永远不应该让子类修改基类中声明的属性,只是应该避免使自动生成的setter受到保护。如果您只需要通过子类创建一个可修改的属性,请为它们提供一个受保护的方法。

答案 1 :(得分:1)

如果您只想在基类中设置属性并将其隐藏在子类中,则应将setter设为私有。

如果你只想在基础ahd子类中设置值,你应该保护它。