为什么建议将实例变量声明为私有?

akh*_*ess 5 java variables inheritance private protected

我的问题与Java有关,但它也可以应用于C#.我想知道为什么每个人都建议将实例变量设为私有而不是让它们受到保护.

让我们考虑一下.子类看不到私有变量,所以如果我需要访问或更改子类中超类的变量,我被迫使用一些访问器和mutators方法,如getMyPrivateVariablesetMyPrivateVariable.但是,当您扩展某个类并继承其成员时,这就像您直接在子类中声明它们一样.从逻辑上讲,这意味着子类也应该直接访问实例变量,并为使用受保护变量设计类提供了理由.我理解这种做法会破坏封装,但这在继承的情况下似乎无关紧要,因为在这种情况下,一切都像超级类的成员在sublcass中声明一样,所以sublcass有一个"自然权利"能够直接访问其成员,无论他们是否继承.在我看来,封装对于通过对象的继承树之外的其他对象与对象进行交互更为重要.

所以,我的问题是为什么每个人都建议将类的实例变量声明为私有而不是受保护?

Dan*_*Dan 1

你自己回答这个问题——封装。

例如,您有一个抽象 Cat 类。这定义了成员变量 speed - 即它运行的速度。

抽象类还定义了一个最终的 run 方法,它显然会更新速度。

现在 - 如果 Cat 的子类 - 例如 Moggy 或 Tabby 可以直接访问和修改“速度”,那么它可能会破坏 run 方法。

所以最好把它绑在开始的地方。如果需要,您也可以在本地声明它。