超类的getter和setter
本文关键字:setter getter 超类 | 更新日期: 2023-09-27 18:25:34
在超类中提供getter和setter,让子类访问超类的属性(换句话说,将属性设置为私有),这仍然是标准做法吗?还是应该由子类直接访问属性(声明属性为受保护的)?
有标准的惯例吗?
这完全取决于您想要完成什么。
如果您希望超类属性在不被继承的情况下是可访问的,那么您需要声明公共getter和setter。
另一方面,如果您希望只有在继承了超类的情况下才能访问成员,那么您需要声明受保护的成员。
如果你想要某种形式的验证,你需要getter和setter。这可以保护超类不受意外损坏,即使它是继承的。
当我在大学攻读CS学位时,我们被告知不要在第二年做getter和setter,而是在第五年做。
我个人的偏好是,只在绝对需要的地方使用getter和setter,而从不使用公共变量。
检查此问题的前两个答案:
getter和setter的设计是否糟糕?看到的矛盾建议
这不是一个很好的答案,但你显然关心编码好的OO,所以你应该考虑一下。
在Java中,我更喜欢将所有字段设为私有字段。如果我真的需要公开一些东西,我会为字段创建一个单独的、受保护的getter。(例如,如果我正在实现的接口需要比我想在不同级别的实现之间传递的返回类型更广泛的返回类型。)
有了可以一键生成getter/setter的工具,我从未觉得有必要破坏父类/子类之间的封装。
就C#而言,如果您有一个数据成员(字段或属性)不是公共的,但对子类很有用,并且应该可以读写,那么就将该成员声明为受保护的。
如果成员应该由子类读取而不是写入,则可以将该成员定义为受保护但具有私有setter的属性:
//as of C# 3.0 this can also be an auto-property
private string myValue;
protected string MyValue
{
get{return myValue;}
private set{myValue = value;}
}
这使得MyValue对继承层次结构之外的类完全隐藏,对子类只读;只有超类本身可以设置该值。这相当于一个带有受保护getter方法和私有setter方法的私有字段。
一般来说,作为超类的设计者,由您来定义子类应该如何使用您提供的内容。如果你让某个东西受到保护,假设子类会做任何"受保护"允许他们做的事情。C#和Java都有可以独立控制读写访问可见性的方法。
似乎在C#中,标准做法是使用带有get/set访问器的属性。在简化的形式中,您将拥有:
public string Name { get; set; }
但您可能对访问级别有更精细的控制,例如:
public string Name { get; protected set; }
在这里,您公开了get方法,但只将set方法留给派生类。
使用访问器而不是直接访问数据成员的另一个好处是,您可以在get/set方法上设置一个断点,并查看是谁执行了该方法。
然而,使用{ get; set; }
技巧是不可能做到这一点的。您必须编写完整的扩展属性表单:
private string m_Name = string.Empty;
public string Name
{
get { return m_Name; } // Put a happy breakpoint here
set { m_Name = value; } // or here.
}
在Java中反映相同的概念是安全的。