Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 超类的getter和setter?_C#_Java_Oop_Encapsulation - Fatal编程技术网

C# 超类的getter和setter?

C# 超类的getter和setter?,c#,java,oop,encapsulation,C#,Java,Oop,Encapsulation,在超类中提供getter和setter,让子类访问超类的属性(换句话说,将属性设置为private),这仍然是标准做法吗?或者子类是否应该直接访问属性(将属性声明为受保护的) 有一个标准的惯例吗?当我在大学里攻读CS学位时,我们被告知不要在第二年攻读“能手”和“二传”,而要在第五年攻读 我个人的偏好是,只在绝对需要的地方使用getter和setter,永远不要使用公共变量。这完全取决于您想要实现什么 如果希望超类属性在不被继承的情况下可以访问,那么需要声明公共getter和setter 另一方面

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


有一个标准的惯例吗?

当我在大学里攻读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的相同概念。

使用哪种语言?C#和Java有不同的用于公开值的可用结构,这可能会影响您在这两种语言中执行此操作的方式。重复:和