2012-02-22 116 views
0

在超类中提供getter和setter是否仍然是标准做法,子类可以访问超类的属性(换言之,将属性设置为私有)?还是应该由子类直接访问属性(将属性声明为受保护的)?超类的吸气和吸气?

是否有标准约定?

+0

用什么语言? C#和Java有不同的可用结构来公开值,这可能会影响你如何在两种语言中执行此操作。 – KeithS 2012-02-22 00:39:24

+0

Duplicate:http://stackoverflow.com/questions/2279662/java-protected-fields-vs-public-getters – 2012-02-22 00:41:51

+0

和http://stackoverflow.com/questions/3525765 – 2012-02-22 00:46:08

回答

0

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

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

1

这完全取决于你想完成什么。

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

另一方面,如果您希望仅当超类继承时才能访问成员,则需要声明受保护的成员。

如果你想要某种形式的验证,你需要getters和setter。这可以保护超类免受无意的腐败,即使它是被遗传的。

0

在Java中,我宁愿将所有的字段设置为私有的。如果我真的需要揭露某些东西,我会为该领域创建一个单独的受保护的获得者。 (例如,如果我正在实现的接口需要比我想要在不同级别的实现之间传递的更宽的返回类型)。

使用只需单击鼠标即可生成getters/setters的工具,我从不觉得有必要打破父母/孩子班级之间的封装。

0

说到C#端,如果您有一个数据成员(字段或属性)不是公有的,但对子类有用并且应该可用于读取和写入,则将该成员声明为受保护的。

如果成员应该由子类可读不可写,你可以定义成员作为被保护的财产,但有私人二传手:

//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都有可以独立控制读取和写入访问的可见性的方法。

0

似乎在C#中,标准做法是使用get/set访问器的属性。 在简化的形式你必须:

public string Name { get; set; } 

但是你可能有过的访问级别更精细的控制,例如:

public string Name { get; protected set; } 

在这里,您公开暴露get方法,但离开集方法仅派生类。

使用访问器而不是直接访问数据成员的另一个好处是可以在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反映相同的概念将是安全的。