面向对象编程的一个重要部分是封装,但公共属性/字段往往会破坏这种封装。在什么情况下公共财产或领域真的有意义?
注意:我只使用术语“属性”或“字段”,因为术语在不同语言之间有所不同。一般来说,我的意思是属于可以从对象外部访问和设置的对象的变量。
答案 0 :(得分:6)
是的,有时候有充分的理由。信息隐藏通常是可取的。但偶尔有一些例外。
例如,公共字段对于:
是合理且有用的答案 1 :(得分:2)
简答:从不。
实际上,如果你使用一个对象来简单地存储数据,但是对象本身没有逻辑,并且你从不打算从这个对象派生,那么拥有公共字段是可以的。有时我在C ++中做这样的事情:
struct A {
int a;
float b;
string c;
A():a(0),b(0.0) {}
A(int a_, float b_, string c_):a(a_),b(b_),c(c_) {}
};
但除了初始化构造函数之外,它只不过是一个C结构。如果你的班级做了更多的事情,那么你永远不应该使用公共(甚至是受保护的)字段。
至于属性,它取决于您使用的语言。例如,在Delphi中,属性的主要目的是为字段提供公共接口,并且可以为它们提供getter / setter,同时仍然在语法上像变量一样工作。
答案 2 :(得分:1)
是否有充分理由使用公众 财产/领域?
否强>
公共成员总是很危险。你现在可能不需要任何控制,但是一旦你暴露它们,你就失去了以后控制的可能性。如果你有gettes / setters,你可以在以后添加控件。
<子> PS: 根据您使用的语言,属性和字段可能意味着不同的东西。 C# properties实际上是实现封装的一种方式,同时又不是非常冗长。 子>
答案 3 :(得分:0)
有一个不好的理由:通过直接访问数据,你可以避免将方法调用推送到堆栈上,这是值得的。
在许多语言中,这也可以通过内联访问器方法来实现。
答案 4 :(得分:0)
如果对象的目的是在其字段中保存数据,那么是。在对象上有方法(a)纯函数(因为它们不会改变对象的状态或其他任何东西)也是有意义的;或(b)操纵物体的状态,重点是他们以特定的方式操纵状态。
你应该避免的事情是(c)基于对象状态对其他对象做事的方法(当然,如果有关于什么是“有效”状态的假设)。