Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 最好改成公开的?或者创建另一个调用超类的方法_Java - Fatal编程技术网

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以绘制自身
  • 一个
    Map
    类,它包含一个MapTiles的链接列表,
    tiles
Map
类中,我想要这样一个循环:

public void draw(Canvas c){
        for(MapTile tile : tiles){
            tile.draw(c);
        }
    }
但我意识到我不能在每个磁贴上调用draw,因为它是
VisibleObject
中受保护的方法。 我可以想出3种可能的解决方案:

  • 只需在
    VisibleObject
    中将
    protected
    更改为
    public
  • 创建一个只调用
    super.draw(c)
    (我认为这是有效语法?)
  • 将映射中的for循环更改为类似这样的内容,我相信这将使其有效 新回路:

    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
    not
    super.draw
    #3也不起作用。为什么您认为方法可见性会影响性能?如果MapTile正在扩展VisibleObject,则应该允许从MapTitle调用VisibleObject中受保护的方法。检查一下,如果唯一的目的是绕过访问修饰符,那么我不明白为什么包装器会是好的样式。@TobiasN.Sasse:它不是包装器,至少从命名上来说是这样
    VisibleObject
    对我来说听起来像一个抽象类。VisibleObject是抽象的:)你说得对,我还觉得应该保留访问权限。调用代码也需要在同一个包中,所以这不是一个解决方案。调用代码可能会调用映射上的公共方法,例如Map.draw可能是公共的。这是一个很好的观点,谢谢!但我试图将我的游戏特有的代码与我以后可以通过使用单独的软件包在另一个游戏中重复使用的代码分开。