扩展类是否可以告诉其超级函数使用某个类

时间:2017-02-01 11:24:29

标签: java inheritance extends

假设您有代表枪的类和代表子弹的类。 扩展枪的类可以有自己特定的扩展子弹类,而枪类超类可以处理它们的数组。

在这个例子中我有两个Gun扩展类,每个都想使用不同类型的bullet扩展类,但是有超级句柄添加到数组中(以避免一堆代码重复)

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)
    }
}

1 个答案:

答案 0 :(得分: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类,以允许子类修改加载行为。