【问题标题】:Pointer of class to point on subclass (Polymorphism)指向子类的类指针(多态性)
【发布时间】:2019-12-08 14:22:55
【问题描述】:

假设 A 是 B 和 C 的超类。 B 是 D 和 E 的超类, C 是 F 和 G 的超类。 (G和F扩展C,E和D扩展B,C和B扩展A)

我有一个 A 类型的数组,我希望它随机选择(比如说 50/50 的机会) 在 B 或 C 类和 B 或 C 类之间随机指向 D 或 E 类和 F 或 G 类的对象。 所以最终我可以对 A 类型的数组执行函数(A 将指向 D、E、F 或 G)

我可以通过在 B 或 C 的承包商内部(随机)创建一个对象来做到这一点吗?

【问题讨论】:

  • 我可以通过在 B 或 C 的承包商内部(随机)创建一个对象来做到这一点吗?:这是什么意思?什么是承包商?还有……你为什么不试着去做,而不是问你的想法是否正确?
  • Mistyped Constructer** 我确实尝试过,但我的执行是错误的,所以我寻求建议......如果这可能的话。
  • 然后发布您尝试过的内容。解释你希望你的代码做什么以及它做什么。 B 的构造函数创建 B。您不能将代码放入 B 的构造函数中以使其构造其他内容。
  • 只是强调一下:构造函数不创建实例; new 语句创建实例,然后执行构造函数来初始化它 - 所以new B(...) 将始终导致B 的实例(或异常)似乎您需要工厂模式或类似模式(例如A.createRandomInstance() ) 或与代表一起工作(A 有一个内部实例可以完成这项工作)

标签: java inheritance polymorphism


【解决方案1】:

我认为你试图做这样的事情:

class A
{
    int value;

    A(int val)
    {
        value =val;
    }

    public void print()
    {
        System.out.println("value in A ="+value);
    }
}

class B extends A
{   
    B(int val)
    {
        super(val);     
    }

    public void print()
    {
        System.out.println("value in B = "+value);
    }
}

class C extends A
{
    C(int val)
    {
        super(val);     
    }

    public void print()
    {
        System.out.println("value in C = "+value);
    }
}

class D extends B
{
    D(int val)
    {
        super(val);     
    }

    public void print()
    {
        System.out.println("value in D = "+value);
    }
}

class E extends B
{
    E(int val)
    {
        super(val);     
    }

    public void print()
    {
        System.out.println("value in E = "+value);
    }
}

class F extends C
{
    F(int val)
    {
        super(val);     
    }

    public void print()
    {
        System.out.println("value in F = "+value);
    }
}

class G extends C
{
    G(int val)
    {
        super(val);     
    }

    public void print()
    {
        System.out.println("value in G = "+value);
    }
}

public class Polymorphism 
{
    public static void main(String[] args)
    {
        A[] array = new A[7];

        //array of type A used to hold objects of all other classes which extend A           
        array[0] = new A(123);//holds object of type A
        array[1] = new B(321);//holds object of type B
        array[2] = new C(111);
        array[3] = new D(13);
        array[4] = new E(1248);
        array[5] = new F(165);
        array[6] = new G(191);//holds object of type G

        for( A a: array)
            a.print();//using reference of type A to invoke overridden functions from individual classes!! 
    }
}

【讨论】:

    猜你喜欢
    • 2021-12-04
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    • 2015-05-03
    • 1970-01-01
    • 2017-04-13
    • 2019-08-28
    • 1970-01-01
    相关资源
    最近更新 更多