2017-02-01 5 views
1

は、あなたが銃を表すクラスと弾を表すクラスを持つと言うことができます。 クラスを拡張するクラスは、独自の拡張された箇条書きクラスを持ち、銃のスーパークラスはそれらの配列を処理できます。私は2つの銃の拡張クラスを持っている。この例では 拡張クラスはそのスーパー関数に特定のクラスを使用するように指示できます

は、それぞれが

psudoを(コードの重複の束を避けるために)弾丸の拡張クラスの異なるタイプを使用しますが、スーパーアレイに追加を処理したいです:

class Gun{ 
    ArrayList<Bullet> bullets; 

    Gun(x,y,z){ 
    } 

    void shoot(){ 
     //add bullet to bullets array 
    } 

} 

class CustomGun extends Gun{ 
    CustomGun(x,y,z){ 
     //do stuff 
    } 
    //want super.shoot() to add CustomBullet to bullets array 

} 

class CustomGunTwo extends Gun{ 
    CustomGunTwo(x,y,z){ 
     //do stuff 
    } 
    //want super.shoot() to add CustomBulletTwo to bullets array 


} 

class Bullet{ 
    Bullet(x,y,z){ 
     //do stuff 
    } 
} 

class CustomBullet extends Bullet{ 
    CustomBullet(x,y,z){ 
     super(x, y, z) 
    } 
} 
class CustomBulletTwo extends Bullet{ 
    CustomBullet(x,y,z){ 
     super(x, y, z) 
    } 
} 
+0

編集ありがとうございます@Jens – WookooUK

+1

あなたは歓迎です – Jens

答えて

2

スーパークラス内のメソッドの動作を変更することはできません。しかし、それをオーバーライドして(サブクラスで)異なる動作を実装することができます。このためにはスーパークラスを適切に実装する必要があります。あなたの例では

、あなたはパッケージプライベートアクセスbulletsを残しているので、CustomGunTwoのメソッドは、リストにカスタム箇条書きを挿入することができます。 bulletsプライベートがある場合は不可能です。

しかし、これを考慮して

public class Gun { 
    private ArrayList<Bullet> bullets; 

    public void shoot(){ 
     load(new Bullet()); 
    } 

    protected void load(Bullet bullet) { 
     bullets.add(bullet); 
    } 
} 

public class CustomGun extends Gun { 
    @Override 
    public void shoot() { 
     load(new CustomBullet()); 
    } 
} 

は、ここでは、サブクラスは、ローディング動作を変更することを可能にするためにGunクラスをを設計しました。

+0

私はそれが好きです:) ありがとう – WookooUK

関連する問題