我来自C ++,实际上我还没有在大学里真正使用过类继承,所以我自己学习。我会以一个例子的形式表达我的怀疑:
假设我有一个名为Entity的类。该实体类包含两个表示X和Y坐标的整数(这不相关,可以是任何其他字段)。然后我有我的班级玩家,扩展实体。看起来很平常,我希望Player也使用x和y字段,Entity类中的一些代码也引用那些字段。
现在我怀疑了。 x和y是公共的,私有的还是受保护的?我觉得它们应该受到保护,因为public不是一个选项(其他类不应该访问它)而private不允许我使用扩展(Player)类中的x和y字段。但我在其他地方读过,类字段永远不应该被保护,只有方法。
除了将变量设置为受保护之外的其他解决方案将会使用来自超级类的getter和setter(在我看来,这不仅是一种不好的做法,而且是完全冗余和不必要的),或者重新声明新类中的那些属性,如果我必须两次输入所有字段声明,让我思考如果我从继承中获得任何奖励。我实际上甚至不知道这最后一件事是否可行,因为我不了解Java,知道它如何处理这种可见性问题。
非常感谢有关该主题的任何帮助。
谢谢。
答案 0 :(得分:4)
[使用getter和setter] ......在我看来,这不仅是一种不好的做法,而且是完全多余和不必要的
实际上不,这通常被认为是最好的方法。有a variety of reasons支持它,从可维护性到安全性。您将创建字段private
,并声明基类中的方法以访问和更改它们。
答案 1 :(得分:2)
如果您希望通过subclass
访问变量,则需要将变量设为protected
。但仍然可以从其他classes
访问这些package
但可以访问setters
。但是除了那些继承了定义变量的类的人之外,那些将被保护免受包之外的类的影响。
是的,您应该定义{{1}}来访问它们,而不是将变量本身设为私有。它实际上并非糟糕,实际上是所有面向对象编程的最佳实践。
答案 2 :(得分:1)
这实际上取决于Entity类的目的。如果它只是x和y的持有者 - 因为你的许多classess会使用它们,那么保护它们就完全没问题了。
如果有任何逻辑绑定到那些坐标 - 特别是验证,一些事件在更改时。然后,您需要使用getter / setter将此逻辑封装在Entity类中。
石头中没有任何内容,只要其他开发人员不依赖于此,你就可以全部重写这一点。如果您有其他依赖于您的代码 - 您必须更安全地设计。但不要过度设计。
答案 3 :(得分:0)
在这种情况下你不能使用无访问说明符吗?使用protected
(除非我弄错了)允许所有子类(包括来自不同包的子类)具有访问权限。在大多数(但不是全部)你只为自己制作一个程序的情况下,如果你想让一个子类访问一个超类的变量,你就可以没有访问说明符。
此图片应为您提供有关所有不同访问说明符的信息。 “Package”列引用同一个包中的子类,“Subclass”列引用子类而不管包。