扩展 class 可以告诉它的超级函数使用某个 class

Can an extended class tell its super function to use a certain class

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

在这个例子中我有两个 Gun extended classes,每个都想使用不同类型的 bullet extended class 但是让 super 处理添加到数组(以避免一堆代码重复)

伪:

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

您不能更改 superclass 中方法的行为。但是您可以覆盖它,并实现不同的行为(在 subclass 中)。需要适当地实施 superclass 才能发生这种情况。

在您的示例中,您已将 bullets 保留为 package private 访问权限,因此 CustomGunTwo 中的方法可以将自定义项目符号插入到列表中。如果 bulletsprivate 那是不可能的。

但考虑一下:

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

这里我们设计Gunclass允许子class修改加载行为。