2

私の知る限り、ベスト プラクティスを使用してゲームを作成しようとしています。私は持っている:

  • 機能VisibleObjectを持つprotected void draw(Canvas c)
  • MapTileそれextends VisibleObject自体を描画すること。
  • MapMapTiles の LinkedList を含むクラスtiles

クラスでは、Map次のようなループが必要でした:

public void draw(Canvas c){
        for(MapTile tile : tiles){
            tile.draw(c);
        }
    }

しかし、各タイルで draw を呼び出すことができないことに気付きましたVisibleObject。私は3つの可能な解決策を考えることができます:

  1. in に変更protectedするだけです。publicVisibleObject
  2. 呼び出すだけのMapTileのパブリックメソッドを作成しますsuper.draw(c)(これは有効な構文だと思いますか?)
  3. Map の for ループをこのようなものに変更すると、有効になると思います。

新しいループ:

MapTile current;
for(MapTile tile : tiles){
    current = tile;
    current.draw(c);
}

どのソリューションがより良いプログラミング実践になるでしょうか?

4

4 に答える 4

3

私はバージョン 2 を選びます。バージョン 1 では、おそらくそこにあるべきではないアクセス修飾子が親に導入されます (たとえば、 from からprotectedpublic)。一方、バージョン 3 では、MapTile(たとえそれがした、それはぎこちなく不自然に見えます)。

クラスの子のいずれかが親の保護されたメソッドを公開する必要がある場合、最善の方法は、親メソッドを呼び出すパブリック メソッドを作成することです。

于 2012-09-01T14:02:31.097 に答える
2

別のオプションもあります: MapMapTileおよびVisibleObject同じパッケージにとどまることです。また、それらは非常に関連しているようです:MapTileは a の一部でありMapMapTileですVisibleObject。このようにして、クラスMapTile.drawからメソッドを確認できます。メソッドをこのパッケージMapの外から見えるようにはしません。draw

于 2012-09-01T14:06:34.400 に答える
1

メソッドを外部オブジェクトから呼び出す必要がある場合は、パブリックにする必要があります。これを回避する方法がわかりません。一方、メソッドがクラス内の他のメソッドによってのみ呼び出される場合は、保護したままにするか、プライベートにします。

私はこれをSwing JComponent#paint(...)and JComponent#paintComponent(...)methodと同様に見ています。前者は Swing ペイント マネージャーによって直接呼び出されるため、パブリックにする必要がありますが、後者はpaint(...)メソッドによって内部的にのみ呼び出されるため、保護されています。

于 2012-09-01T14:01:13.670 に答える
1

draw() は public であるべきだと私には思えます。draw() メソッドは、MapTile オブジェクトを作成または保持するすべてのオブジェクトに非常に関連しているようです。

ただし、他のユーザーがマップ内の特定の MapTiles にアクセスできないようにすることは、別のことです。ここで負担は Map クラスにかかっています。MapTiles の LinkedList はおそらく非公開にする必要があります。他のオブジェクトがそれを必要とする場合、いくつかの getter メソッド ( public LinkedList<MapTiles> getMapTiles()) を提供して、リスト (のコピー?) にアクセスできるようにすることができます。他のオブジェクトが MapTiles にアクセスする方法が本当に心配な場合は、Map と MapTiles を同じパッケージに配置して、これらのオブジェクトが情報を交換できるようにし、他のパッケージの他のクラスが特定の public getter メソッドにしかアクセスできないようにする必要があります。

于 2012-09-01T14:06:45.630 に答える