Java 最好改成公开的?或者创建另一个调用超类的方法
我试图用我所知的最佳实践来创建一个游戏。 我有:Java 最好改成公开的?或者创建另一个调用超类的方法,java,Java,我试图用我所知的最佳实践来创建一个游戏。 我有: 具有受保护的空白绘制(Canvas c)功能的可视对象 一种贴图块,它扩展了VisibleObject以绘制自身 一个Map类,它包含一个MapTiles的链接列表,tiles 在Map类中,我想要这样一个循环: public void draw(Canvas c){ for(MapTile tile : tiles){ tile.draw(c); } } 但我意识到我不能在每
- 具有
功能的受保护的空白绘制(Canvas c)
可视对象
- 一种
,它扩展了VisibleObject以绘制自身贴图块
- 一个
类,它包含一个MapTiles的链接列表,Map
tiles
Map
类中,我想要这样一个循环:
public void draw(Canvas c){
for(MapTile tile : tiles){
tile.draw(c);
}
}
但我意识到我不能在每个磁贴上调用draw,因为它是VisibleObject
中受保护的方法。
我可以想出3种可能的解决方案:
VisibleObject
中将protected
更改为public
super.draw(c)
(我认为这是有效语法?)MapTile current;
for(MapTile tile : tiles){
current = tile;
current.draw(c);
}
哪种解决方案更适合编程实践?如果该方法需要由外部对象调用,那么它必须是公共的。我看不出有什么办法。另一方面,如果该方法仅由类内的其他方法调用,则将其保留为受保护或私有
我认为这类似于Swing
JComponent#paint(…)
和JComponent#paintComponent(…)
方法。前者由Swing paint manager直接调用,因此必须是公共的,而后者仅由paint(…)
方法在内部调用,因此受到保护。我选择版本2。版本1将在父级中引入可能不存在的访问修饰符(例如,从受保护的
到公共的
),而版本3没有多大意义,因为您仍在使用MapTile
的实例(即使有,它看起来也很尴尬和不自然)
如果类的任何子类需要公开父类的受保护方法,最好的办法是创建一个调用父类方法的公共方法。还有另一个选项:
Map
、mappile
和VisibleObject
保持在同一个包中。它们似乎也非常相关:mappile
是Map
的一部分,mappile
是可见对象。通过这种方式,您可以从Map
类中查看MapTile.draw
方法。我不会让draw
方法在这个包之外可见。在我看来,draw()应该是公共的。draw()方法似乎与要创建或保存MapTile对象的任何对象都非常相关
但是,要禁止其他人访问地图中的特定地图分幅,则是另一回事。这里的负担落在Map类上。MapTiles的LinkedList可能是私有的。如果其他对象需要,可以提供一些getter方法(publicLinkedList getMapTiles()
)来访问列表(副本?)。如果您真的担心其他对象如何访问MapTiles,那么Map和MapTiles应该在同一个包中,以便这些对象可以交换信息,而其他包中的其他类只能访问某些公共getter方法。this.draw
notsuper.draw
#3也不起作用。为什么您认为方法可见性会影响性能?如果MapTile正在扩展VisibleObject,则应该允许从MapTitle调用VisibleObject中受保护的方法。检查一下,如果唯一的目的是绕过访问修饰符,那么我不明白为什么包装器会是好的样式。@TobiasN.Sasse:它不是包装器,至少从命名上来说是这样VisibleObject
对我来说听起来像一个抽象类。VisibleObject是抽象的:)你说得对,我还觉得应该保留访问权限。调用代码也需要在同一个包中,所以这不是一个解决方案。调用代码可能会调用映射上的公共方法,例如Map.draw可能是公共的。这是一个很好的观点,谢谢!但我试图将我的游戏特有的代码与我以后可以通过使用单独的软件包在另一个游戏中重复使用的代码分开。