定义私有属性而不是公共属性有什么好处?如果我可以将它们公开,为什么还要创建额外的工作来创建访问和修改私有属性的方法?
在短期内没有,除了让OOP纯粹主义者不高兴.
(我假设你的意思是揭露否则会使用getter/setter的属性 - 显然,如果你将所有属性公开,那么会有很大的不同).
从长远来看,有一些很好的理由.
首先,它允许您在源头验证输入,而不是以后必须使用硬件断点和黑魔法的组合来回溯原点.
例如
void Foo::setWeight(float weight) { ASSERTMSG(weight >= 0.0f && weight <= 1.0f, "Weights must fall in [0..1]"); mWeight = weight; }
它还允许您以后更改对象的行为,而无需重构客户端代码.
例如
void Foo::setSomething(float thing) { mThing = thing; // 2009/4/2: turns out we need to recalc a few things when this changes.. ... }
如果使用getter/setter,则可以在更改或访问时执行逻辑.您可以验证输入,而不是假设它总是正确的.您可以跟踪获取值的次数.
最重要的是,这是一个很好的设计.它为您,班级的开发人员提供了对其使用方式的更多控制,以及更好的防止滥用,滥用或只是某人做错事的能力.