这是一个 Java 编程情况,我希望看到任何可能的改进。
B 类是 A 类的子类。B 的一些实例在 Collection 中。根据类型,我可以使用 instanceof 从集合中检索 B 类实例。但是,我不能将这些实例视为 B 类的实例,而是 A 类的实例,因为不允许向下转换。因此,我必须通过在 A 类中使用覆盖 getter 来获取一些实例的小片段。这种变通方法存在一些问题。例如,某些 getter 在父类中没有意义,父类不能是抽象的。
有更好的解决方案吗?
这是一个 Java 编程情况,我希望看到任何可能的改进。
B 类是 A 类的子类。B 的一些实例在 Collection 中。根据类型,我可以使用 instanceof 从集合中检索 B 类实例。但是,我不能将这些实例视为 B 类的实例,而是 A 类的实例,因为不允许向下转换。因此,我必须通过在 A 类中使用覆盖 getter 来获取一些实例的小片段。这种变通方法存在一些问题。例如,某些 getter 在父类中没有意义,父类不能是抽象的。
有更好的解决方案吗?
一种不进行强制转换的方法是使用访问者模式。它在 Java 中有点冗长,但非常可扩展......
interface Visitor {
void visit(A a)
void visit(B b)
}
class BOnlyVisitor implements Visitor {
public void visit(A a) {
throw new UnsupportedOperationException();
}
public void visit(B b) {
// Do stuff with b
}
}
interface Visitable {
void accept(Visitor v)
}
class A implements Visitable {
public void accept(Visitor v) {
v.visit(this);
}
}
class B implements Visitable {
@Override
public void accept(Visitor v) {
v.visit(this);
}
}
与其向对象询问信息以便做某事,不如直接要求对象去做。例如,替换
int a = object.getA();
int b = object.getB();
int sum = a + b;
和
int sum = object.computeSum();
这样,如果子类没有 getB() 方法,因为它总是被认为是 0,它可以使用实现该computeSum()
方法
return this.a;
对不起这个愚蠢的例子,但这就是想法。向您的对象添加行为,而不是使用 getter 和 setter 使它们成为数据结构。如果您发布一个具体示例说明您必须做什么,我可以提供更多帮助。