如何使用不同的 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.member
是 X
的实例,请使用这样的 if 测试
if (b1.member instanceof X) System.out.println(((X)b1.member).strX);
我有一个超级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.member
是 X
的实例,请使用这样的 if 测试
if (b1.member instanceof X) System.out.println(((X)b1.member).strX);