如何使用不同的 class 作为一个 class 的成员?

How do I use different classes as member for one class?

我有一个超级class A,两个继承自A的classes X,Y和另一个class B,我将在其中使用X,Y作为成员。

public class A {
    public String strA;
}

public class X extends A {
    public String strX;
}

public class Y extends A {
    public String strY;
}

public class B {
    public A member;

    public B(A member) {
        this.member=member;
    }
}

public static void main() {
    X x = new X();
    Y y = new Y();

    B b1 = new B(x);
    B b2 = new B(y);

    System.out.println(b1.strA); //works
    System.out.println(b1.strX); //does not work!
    System.out.println(b2.strA); //works
    System.out.println(b2.strX); //does not work!
}

我该如何解决这个问题?

我的方法是使用 B 中成员的数据类型作为占位符?

谢谢!

您的代码没有像 Jon Skeet 所说的那样编译,因为您正在尝试访问 B 字段的字段。

要编译,代码本来是

System.out.println(b1.member.strA); //works

要使用继承实例中的字段,您必须在此处明确地转换您的 member 引用。

如果您使用对母类的引用,它只会显示可从母类访问的字段。

在这种情况下,只有 strA 可以通过 A 引用访问。


解决方案

System.out.println(((X)b1.member).strX);

如您所见,首先我们将 b1.member 转换为 X,然后调用 strX 字段。

如果您想确定 b1.memberX 的实例,请使用这样的 if 测试

if (b1.member instanceof X) System.out.println(((X)b1.member).strX);