私は enumerate()
の形のリストを持つ基本クラスShapeManager
を持っています。その後Shape
秒のColoredShape
の代わりに、特殊な処理に を望んでいる専門ColoredShapeManager
があります:子どもと基底型のリストを共有する
+----------------+ +-------------------------------------+
| Shape | | ShapeManager |
|----------------| |-------------------------------------|
| + id: int | | # shapes: List<Shape> |
| | | |
| | | + ShapeManager() { |
| | | shapes.add(new Shape()); |
| | | } |
| | | |
| | | + abstract void enumerate() { |
| | | for (Shape s: shapes) { |
| | | // use s |
| | | } |
| | | } |
+----------------+ +-------------------------------------+
^ ^
| |
+ +
+----------------+ +-------------------------------------+
| ColoredShape | | ColoredShapeManager |
|----------------| |-------------------------------------|
| + color: int | | + ColoredShapeManager() { |
| | | shapes.add(new ColoredShape()); |
| | | } |
| | | |
| | | + abstract void enumerate() { |
| | | for (Shape s: shapes) { |
| | | // use (ColoredShaped) s |
| | | // will fail for Shapes |
| | | } |
| | | } |
+----------------+ +-------------------------------------+
私はShapeManagerがColoredShapeManager.enumerate()
が プロセスColoredShape
秒に望んでいるので、これは欠陥があるようで、その 子供とshapes: List<Shape>
を共有する必要があるかどうかわかりませんよ。したがって、要素をキャストしますが、 (基本クラスによって追加された要素)の一部はShape
であり、キャストは失敗します。
ある:形状の
- 両方のタイプがリスト
shapes
で終わります。 enumerate()
には、ColoredShape
へのアクセス権が必要です。
リストを分割して、2人の管理者のそれぞれでプライベートリストを作成してください。次に、子の中で列挙すると、 "その"型の形を反復し、親のenumerate()
を開始点/終了点として呼び出します。
http://www.asciiflow.com/#Draw素晴らしいツール! –
最適な解決策は、シェイプで何をしているかによって異なります。例えば、あなたが 'enumerate'のループの形を描画しようとしている場合(私の意見では、表示するコードの名前の選択肢が貧弱です)、描画する場合、すべての図形が色付きで、そうではありません。すべてのインスタンスに適用される 'Shape'クラスの呼び出しメソッドが混在し、 'Shored'インスタンスには適用されない 'ColoredShape'クラスのメソッドを呼び出すと、その組み合わせによって最適な方法が判断されることがあります。 –
問題のポイントは、 'ColoredShape'固有の関数/プロパティ(この例では' color')を使う方法です。 –