java - 如何在父类(super class)中使用子类方法?

标签 java inheritance methods casting return-value

我有一个名为 Parameter 的父类(super class)。有许多不同类型的参数,当然它们有不同的方法。问题是我将参数初始化为子类事件之一,但它仍然不允许我使用子类事件!

 package com.lbg.c2;

public class Parameter {

private  String  type;

public static final Parameter NumberParam = new NumberParam();
public static final Parameter StringParam = new StringParam();
public static final Parameter AnyTypeParam = new AnyTypeParam();
public static final Parameter AnimationParam = new AnimationParam();
public static final Parameter AudioParam = new AudioParam();
public static final Parameter CmpParam = new CmpParam();
public static final Parameter ComboOptionParam = new ComboOptionParam();
public static final Parameter ComboParam = new ComboParam();
public static final Parameter KeybParam = new KeybParam();
public static final Parameter LayerParam = new LayerParam();
public static final Parameter LayoutParam = new LayoutParam();
public static final Parameter ObjectParam = new ObjectParam();

public Parameter () {

}

public Parameter (String t) {
    type = t;
}

public String getType() {
    return type;
}

public static Parameter init (String t) {
    if (t.equals("number")) {
        return NumberParam;
    }
    else if (t.equals("string")) {
        return StringParam;
    }
    else if (t.equals("any type")) {
        return AnyTypeParam;
    }
    else if (t.equals("animation")) {
        return AnimationParam;
    }
    else if (t.equals("audio")) {
        return AudioParam;
    }
    else if (t.equals("comparision")) {
        return CmpParam;
    }
    else if (t.equals("combo option")) {
        return ComboOptionParam;
    }
    else if (t.equals("combo")) {
        return ComboParam;
    }
    else if (t.equals("keyboard")) {
        return KeybParam;
    }
    else if (t.equals("layer")) {
        return LayerParam;
    }
    else if (t.equals("layout")) {
        return LayoutParam;
    }
    else if (t.equals("object")) {
        return ObjectParam;
    }
    else {
        return new Parameter();
    }
}

}

此方法在 Parameter 类中静态找到,因此您可以从传递的字符串中初始化它。

        add.addActionListener(new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent e) {
            String types [] = {"number","string","any type","comparision","combo option",
            "combo","object","layer","layout","keyboard","animation","audio"};
            JComboBox<String> box = new JComboBox<String>(types);
            JLabel text = new JLabel ("Select the parameter type:\n");
            JPanel panel = new JPanel();
            panel.setLayout(new BorderLayout());
            panel.add(text, BorderLayout.NORTH);
            panel.add(box, BorderLayout.SOUTH);

            JOptionPane.showMessageDialog(frame, panel, "New Parameter", JOptionPane.QUESTION_MESSAGE);

            Parameter p = Parameter.init((String) box.getSelectedItem());

            if (p instanceof NumberParam || p instanceof StringParam || p instanceof AnyTypeParam) {
                String label = JOptionPane.showInputDialog(frame,"Parameter Label?","New Parameter",JOptionPane.QUESTION_MESSAGE);
                p.setLabel(label); // it says it needs casting!!
            }
        }

    });

现在,Parameter 静态方法必须返回 Parameter 类的子类,但它仍然不允许我这样做。但现在它是一个子类,为什么它不允许我使用它的方法?

这就像说你是一个设备,然后我将你子类为电话,你不能调用其他人,因为你仍然被称为设备

最佳答案

父类永远无法知道从它继承的子类是谁。如果您在 Child 类中定义了一个方法,则该方法只能由 Child 类实例访问/调用。但反之则不然,如果在父类中定义了一个方法,则所有子类实例都可以访问/调用它。

例如:-

Object o = new String("Hi"); //will work because Object is parent class of String 
o.trim(); // can't call/will give compilation error because parent Object does not know child String's trim()
if(o.getClass().equals(String.class) ){ // check actual runtime class of o
            String ss = (String) o; //typecasting
            System.out.println(ss.trim()); // will work on String object
        }

关于java - 如何在父类(super class)中使用子类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31232538/

相关文章:

java - 为什么 toString() 方法在 Java 中的 Array 和 ArrayList 对象之间工作不同

java - 如何在android中更改日期时间语言

java - 如何在另一个类中调用Java类中的变量

c++ - 调用基类的构造函数时对 vtable 的 undefined reference

java - 必须输入两次才能扫描仪读取

.net - 方法会影响对象的大小吗?

java - chrome 中的混合内容错误

java - 用于 Java EE 的 Eclipse Juno 仅在一个 Java SE 类上没有 "Run as Java Application"

c++ - 编译时字符串赋值用于运行时识别

c++ - 防止指针重新分配