首先让我说,我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。
提前感谢。
答案 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;
}
}