假设您有代表枪的类和代表子弹的类。 扩展枪的类可以有自己特定的扩展子弹类,而枪类超类可以处理它们的数组。
在这个例子中我有两个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)
}
}
答案 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
类,以允许子类修改加载行为。