没有演员的不同阶级的arraylist?

时间:2013-04-27 09:31:35

标签: java arraylist

首先让我说,我DID搜索了几个小时,并没有找到我需要的确切内容。

我需要运行类(app)数组并使用当前应用程序的变量和方法。

public class App {
   public final Integer number = 0;
}

public class Player extends App {
   public final Integer number = 1;
}

public class Navigation extends App {
   public final Integer number = 2;
}

public class Phone extends App {
   public final Integer number = 3;
}


private ArrayList<App> apps = new ArrayList<App>();

apps.add(new Player());
apps.add(new Navigation());
apps.add(new Phone());

如果我这样做

apps.get(0).number //  = 0

我得到父母(app)的号码

如果我把它投到播放器

(Player) apps.get(0).number //  = 1

我得到了理想的结果

现在,我希望在应用中的多个位置运行所有N个应用(可能超过3个) 但我不想这样做:

if (gun instanceof Player)
{
   Player p = (Player) apps.get(0);

}else if .... N times... in N places

我也不想让应用程序成为界面,因为我需要应用程序默认值。

如果你有更好的主意,没有必要使用arraylist。

提前感谢。

4 个答案:

答案 0 :(得分:5)

使用方法而不是最终变量。 App.getNumber(),然后每个类都可以覆盖该方法以返回适当的值。每个类都可以返回相同的常量,但将常量定义为private并确保使用getter方法

答案 1 :(得分:1)

基本问题是在Java中,数据成员不是多态的。这意味着以下

public class Player extends App {
   public final Integer number = 1;
}

不会覆盖App.number。它的作用是创建一个与App.number完全无关但又称为number的新数据成员。

因此,当您执行obj.number时,只有obj的编译时类型才能确定访问哪个number。运行时类型obj不参与其中。

要实现多态行为,请使用以下方法:

public class App {
   public Integer getNumber() { return 0; }
}

public class Player extends App {
   @Override
   public Integer getNumber() { return 1; }
}

...

更简洁的方法是将App放入抽象类或接口,这样App.getNumber()是抽象的,必须在派生类中重写。

答案 2 :(得分:0)

使用抽象方法或界面:

抽象方法:

public absteact class App {
    public absteact int getNumber();
}

public class Player extends App {
    public int getNumber() {return 1:}
}
// etc

接口:

public interface HasNumber {
     public int getNumber();
}

public absteact class App implements HasNumber {
}

public class Player extends App {
    public int getNumber() {return 1:}
}
// etc

从经典设计的角度来看,界面版本是可取的,但两者都是可以接受的

答案 3 :(得分:0)

您可以使用一个方法创建一个接口,并在所有类中实现该接口的方法,您将在ArrayList中添加所有类,然后您可以直接获得数字值,检查它可能对您有帮助的样本。

import java.util.ArrayList;

public class Manager1 {

public static void main(String[] args) {
    ArrayList<App> list = new ArrayList<App>();
    list.add(new Playre());
    list.add(new Navigation());
    list.add(new Phone());

    System.out.println(list.get(0).getNumber());
}
}

interface App {
public abstract int getNumber();
}
class Playre implements App {
private final int number = 1;
@Override
public int getNumber() {
    return number;
}
}
class Navigation implements App {
private final int number = 2;
@Override
public int getNumber() {
    return number;
}
}
class Phone implements App {
private final int number = 3;
@Override
public int getNumber() {
    return number;
}
}