【发布时间】:2015-09-11 18:24:52
【问题描述】:
我有一个班级 C 有很多成员(比如 10 个成员)+ 仅在 C 中的成员
我还有两个班级A 和B 正好有上面提到的10 个成员。 (A和B各自没有这10个成员。这10个成员分布在A和B之间,A和B的其他字段很少)
class C {
private int member1;
private String member2;
private String member3;
private float member4;
...
private String member10;
private member11_only_in_C;
private member12_only_in_C;
...
}
class A {
private String memeber10;
private float member4;
private double member6;
....
}
class B {
private int memeber1;
private String memeber2;
private String member7;
....
}
所以当我有cObject 时,我需要设置A 和B 中所有成员的值
aObject.setMember10(cObject.getMember10());
bObject.setMember1(cObject.getMember1());
... and so on for all 10 members
这看起来很糟糕(很长一段时间,如果我向 C、A、B 添加更多成员,我需要为它们编写设置器)。所以我的想法是如果我有 C 类 extend or implement A and B 我可以 cast 它喜欢
A aObject = (A)cObject;
B bObject = (B)cObject;
但问题是
- Java 不允许多重继承
- 我不能将
A和B作为接口,因为我需要设置它们的值。 (如果我将它们作为接口,它们的成员将变为final,这意味着我无法更改它们的值) - 我不能扩展一个类并实现另一个类。 (然后我无法设置接口成员的值)
我现在能做什么?
谢谢..
【问题讨论】:
-
您已经说过
A、B和C之间的相似之处(它们都有相同的字段),但有什么区别?为什么你需要 3 个类而不是 1 个? -
A 和 B 的成员在 C 中。C 可以有任何其他字段。
-
这仍然是糟糕的代码设计。您应该有一个只有公共成员的基类,并使用聚合和继承(或其他一些非基于类的方法)将其他成员合并到 A、B 和 C 中。
-
正如@ShotgunNinja 所说,正确的设计应该是这样的:如果 C 是自卸卡车,B 可能是卡车,A 可能是机动车辆,所以 A 是 B 的超类B 是 C 的超类。没有什么可以阻止 D 类,比如说汽车也有 A,因为它是超类。您的投射代码仍然可以正常工作。
-
如果不能改变A、B、C的层次结构,那么你应该考虑将A和B封装在C内部,并路由C的访问器使用A或B来提供信息需要。然而,这可能是草率和过度的,并且可能会降低用户了解其信息来自何处的能力。
标签: java inheritance implements