1

首先让我说,我确实搜索了几个小时并没有找到我需要的东西。

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

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

我得到了父母(应用程序)的号码

如果我将它投射给玩家

(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

4 回答 4

5

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

于 2013-04-27T09:36:44.973 回答
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()是抽象的,并且必须在派生类中被覆盖。

于 2013-04-27T09:55:06.327 回答
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

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

于 2013-04-27T09:52:07.387 回答
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;
}
}
于 2013-04-27T10:07:57.890 回答