Java 在超类ArrayList中使用统一名称调用子类方法
我正在寻找一个更简单的解决当前问题的方法 我有:Java 在超类ArrayList中使用统一名称调用子类方法,java,arraylist,subclass,Java,Arraylist,Subclass,我正在寻找一个更简单的解决当前问题的方法 我有: public class Projectile{ .... } public class Bomb extends Projectile{ .... public void move(){ //travels in arc } } public class Bullet extends Projectile{ .... public void
public class Projectile{
....
}
public class Bomb extends Projectile{
....
public void move(){
//travels in arc
}
}
public class Bullet extends Projectile{
....
public void move(){
//travels straight
}
}
现在,假设我有一个大的抛射物阵列列表,其中既有炸弹也有子弹。我正在寻找一种在炸弹和子弹中调用移动方法的方法
for(Projectile projectile: projectiles){
//functional equivalent of projectile.move();
}
我的特定项目将有大量不同的子类型,因此我试图避免为每个可能的子类型检查“实例”
我知道我可以输入sparlode作为接口,但这是我的计划B,因为sparlode类包含大量信息
有没有更好的方法,或者我最好选择上述两种解决方案之一?Sproject类应该声明一个具有受保护或公共访问权限的非静态抽象方法move(),此类的每个子类(如Bomb或Bullet)都必须实现此方法
编辑:将move方法声明为抽象方法,除非您不希望在父类中使用默认实现。否则,继续进行方法重写,以便子类重写父类行为。使用类似列表的通用通配符怎么样 此列表可以包含炸弹和子弹这两个类 更多细节
在投射类中,编写move方法,使其仅包含属于所有子类的功能。然后,在需要添加/更改它的每个子类中,重写move方法并添加区分它所需的任何附加代码。这应该允许您为每个投射物调用相同的move(),但确保它对正确的投射物执行正确的操作。根据您的要求,您可以使用 在你的代码中,你可以有
public void move()
方法,在抛射体中有一些默认的业务逻辑,类Bomb
和Bullet
扩展抛射体
类意味着它们是抛射体
的子类,在这里你可以覆盖每个类中的move()
方法,在运行时,您可以有一个列表射弹
列表,其中可以包含射弹
子类的射弹
对象的对象
因此,当您迭代射弹并调用move()
方法时,java运行时将决定哪个对象(Bomb
或Bullet
)move()
必须调用哪个intern删除instanceof
关键字用法
根据您的示例,您可以执行以下操作
public class Projectile {
....
public void move() {
//default implementation
}
}
public class Bomb extends Projectile {
....
public void move() {
//travels in arc
}
}
public class Bullet extends Projectile {
....
public void move() {
//travels straight
}
}
public class TestMain {
public static void main() {
List<Projectile> projectiles = new ArrayList<>();
projectiles.add(new Bomb());
projectiles.add(new Bullet());
for (Projectile projectile : projectiles) {
projectile.move();
}
}
}
公共类{
....
公开作废动议(){
//默认实现
}
}
公营炸弹{
....
公开作废动议(){
//以弧线行进
}
}
公共级子弹弹{
....
公开作废动议(){
//直走
}
}
公共类TestMain{
公共静态void main(){
列表投射物=新的ArrayList();
添加(新炸弹());
添加(新项目符号());
用于(射弹:射弹){
投射物。移动();
}
}
}
将射弹类定义为抽象类。并在类中定义抽象的move()方法。这是我最初尝试的,但它总是调用该方法的默认版本。哦,嗯,我没有考虑这种可能性。拉文德拉预见到了这一点。我想关键是在超类中将方法定义为抽象的。很高兴了解未来;)。