【问题标题】:Is it possible to call the same method on different object types of same parent class with an ArrayList in Java?是否可以在 Java 中使用 ArrayList 对同一父类的不同对象类型调用相同的方法?
【发布时间】:2017-02-13 07:37:56
【问题描述】:

由于应该测试我们对继承的理解的家庭作业,我有许多不同的子类,它们最终都具有相同的实例变量。在每个子类中,我都有一个方法printInfo() 打印所有实例变量。 printInfo() 在它存在的每个类中都完全相同,但我很确定我不能将它移动到任何父类,因为某些实例变量只存在于该子类中(也就是还包含printInfo())。根据我的阅读,我可以使用这样的父类创建一个包含每个对象的 ArrayList:

ArrayList<Parent> myArrayList = new ArrayList<Parent>;
myArrayList.add(new Child1());
myArrayList.add(new Child2());

我的问题是我希望能够在此 ArrayList 中的每个对象上调用 printInfo()。我尝试使用这样的 for 循环:

for(int i = 0; i < myArrayList.size(); ++i) {
    myArrayList.get(i).printInfo();
}

但它不会识别我的printInfo() 方法,因为它只存在于子类中,而不存在于 ArrayList 使用的父类中。我假设这是因为 ArrayList 包含 Parent 类的对象,因此它不会调用子类的任何成员函数。有什么方法可以使用 ArrayList(或类似的数据结构)调用 printInfo() 方法吗?

注意:考虑到有多个子类具有相同的方法,我知道这个程序设计得很糟糕,但我被告知这正是作业所期望的。我不需要关于如何重组类的建议,我只想找到一种方法来有效地在不同类的多个对象上调用相同的方法。

【问题讨论】:

  • 我也怀疑这个作业设计得不好。它可能是为了教你关于继承的知识。
  • 我认为,为了使用继承而不是使用更适用的策略来构建易于阅读和维护的程序,必须在多个类中重用相同的代码是一项设计不佳的任务。
  • 不清楚你复制了什么。如果您实际上自己复制了代码,那么当然,您可以将“共享”实例变量组合到一个公共类中

标签: java inheritance arraylist


【解决方案1】:

有什么方法可以使用 ArrayList(或类似的数据结构)调用 printInfo() 方法?

仅当父类或接口具有printInfo() 方法时。请注意,即使父类有printInfo() 方法,每个子类都可以覆盖它,并在方法中打印自己的变量。通常这样的方法会在调用自己的变量之前先调用父级的超级方法。

例如:

import java.util.ArrayList;
import java.util.List;

public class ParentChild {
    public static void main(String[] args) {
        List<Parent> parentList = new ArrayList<>();
        parentList.add(new Parent());
        parentList.add(new Child1());

        for (Parent obj : parentList) {
            obj.printInfo();
            System.out.println();
        }
    }
}

class Parent {
    private int a = 0;

    public int getA() {
        return a;
    }

    public void setA(int a) {
        this.a = a;
    }

    public void printInfo() {
        System.out.print("a: " + a);
    }
}

class Child1 extends Parent {
    private int b = 2;

    public int getB() {
        return b;
    }

    public void setB(int b) {
        this.b = b;
    }

    @Override
    public void printInfo() {
        super.printInfo();
        System.out.println("; b: " + b);
    }
}

【讨论】:

    【解决方案2】:

    在每个子类中,我都有一个打印所有实例变量的方法 printInfo()。 printInfo() 在它存在的每个类中都完全相同

    看起来不错

    但我很确定我不能将它移动到任何父类,因为某些实例变量只存在于该子类(也就是也包含 printInfo() 的类)中。

    不过,您可以移动方法。您需要在每个孩子中覆盖它。如果父级中不存在某些变量并不重要,只需打印您拥有的变量即可。方法的内容是不同的。这就是任务——理解继承和方法覆盖。

    如果需要打印父变量,可以在子类中调用super.printInfo()。

    例如,如果父类和子类都有一些同名的实例变量,那么子类正在“隐藏”父类的变量。应该不需要复制任何东西。

    但它无法识别我的 printInfo() 方法。

    一旦你在 Parent 类上实现了该方法,它就会实现。一旦你有一个扩展父对象的对象,那么它将调用被覆盖的方法。

    因为它只存在于子类中,而不存在于ArrayList使用的父类中

    假设您出于某种原因无法移动该方法...我想您可以这样做。不过不确定。我一直不擅长处理这样的继承,因为我对这些设计没有太多经验。

    Parent p = myArrayList.get(i);
    if (p instanceof Child1) {
        ((Child1) p).printInfo();
    }
    

    【讨论】:

    • @comp1020comp: 板球和我的答案是一样的。给父类一个printInfo() 方法,并在需要它被覆盖的子类中覆盖它。时期。故事结局。句号。
    • 在父类中定义方法并在每个后续子类中覆盖它工作得很好,所以我接受了答案。
    猜你喜欢
    • 2016-05-20
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 2023-03-17
    • 2022-11-14
    • 1970-01-01
    • 2020-04-30
    • 1970-01-01
    相关资源
    最近更新 更多