超类的吸气剂和制定者?

时间:2012-02-22 00:37:05

标签: c# java oop encapsulation

在超类中提供getter和setter仍然是标准做法,因为子类可以访问超类的属性(换句话说,将属性设置为private)?或者是否应该通过子类直接访问属性(将属性声明为受保护的)?

是否有标准惯例?

6 个答案:

答案 0 :(得分:1)

这完全取决于你想要完成的事情。

如果希望在不继承的情况下访问超类属性,则需要声明公共getter和setter。

另一方面,如果您希望只有在继承超类的情况下才能访问成员,那么您需要声明受保护的成员。

如果您需要某种形式的验证,则需要使用getter和setter。这可以保护超类免于意外损坏,即使它是继承的。

答案 1 :(得分:0)

当我在大学攻读CS学位时,我们被告知不要在第二年做吸气剂和制定者,并在第五年做。

我个人的偏好是使用绝对需要的getter和setter,并且永远不会有公共变量。

答案 2 :(得分:0)

检查此问题的前两个答案:

Are getters and setters poor design? Contradictory advice seen

对你的问题不是一个很好的答案,但你显然关心编写好的OO,所以你应该给他们一些思考。

答案 3 :(得分:0)

在Java中,我更喜欢将我的所有字段设为私有。如果我真的需要暴露某些东西,我会为该字段创建一个单独的受保护的getter。 (例如,如果我正在实现的接口需要比我想要在不同级别的实现之间传递的更广泛的返回类型。)

使用可以通过鼠标点击生成getter / setter的工具,我甚至不需要在父/子类之间打破封装。

答案 4 :(得分:0)

对于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都有一些方法可以独立控制读写访问的可见性。

答案 5 :(得分:0)

似乎在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反映相同的概念是安全的。