由于业务需求,现有
基类A,派生类A1、A2
基类B,派生类B1、B2
目前是基类A持有基类B,但是业务上需要A1持有B1,A2持有B2,怎样设计会比较好?
谢谢
给你一个参考方案,另外也可以考虑用泛型来处理。不管 Java 的泛型我不太熟,等其他高人了
class B {}
class B1 extends B {}
class B2 extends B {}
class A {
B data;
B getData() {
return data;
}
void setData(B b) {
data = b;
}
}
class A1 extends A {
B1 data;
B1 getData() {
return (B1) super.getData();
}
void setData(B1 b) {
super.setData(b);
}
void setData(B b) {
if (!(b instanceof B1)) {
throw new ClassCastException();
}
super.setData(b);
}
}
这个采用泛型可以很好地解决问题
class A<T extends B> {
private T b;
public T getB() {
return b;
}
}
class B {
}
class A1 extends A<B1>{
}
class B1 extends B{}
class A2 extends A<B2>{}
class B2 extends B{}
不知道这个是不是你要的:
public class B {
}
public class B1 extends B {
}
public class B2 extends B {
}
public class A <T extends B> {
private T data;
public T getData(){ return data;}
public void setData(T data) {
this.data = data;
}
}
public class Main {
public static void main(String[] args) {
A<B1> a1 = new A<B1>();
A<B2> a2 = new A<B2>();
a1.setData(new B1());
a2.setData(new B2());
// .....
}
}
使用泛型,A这边不需要继承结构。
15 回答8.4k 阅读
8 回答6.2k 阅读
1 回答4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答3.1k 阅读
2 回答3.8k 阅读
3 回答1.7k 阅读✓ 已解决
鄙人抽象思考能力有限,所以我还是得把
A
和B
两个类对应到具体的东西来思考:Arm(武器): Mauser(毛瑟), Rifle(来福), Revolver(左轮), Pistol(手枪)
Bullet: Gold, Silver (wow!!), Copper

@边城 我给出的解决方案使用了泛型,主要是提供另一种思路。不一定比不用泛型简洁。
由于业务相关信息在问题中不很清楚,我做个假设--除了持有之外,并不对B1,B2做customized的操作。
如果上面得假设不合理,请指出。我可以再改进方案。