这里是一个Java编程情我愿看到任何可能的改进。得到一个子类的实例从一个集合 - Java的
B类是类A的一个子类B的一些实例是在集合。根据类型,我可以使用instanceof从集合中检索B类实例。但是,我不能将这些实例视为B类的实例,但是A类的唯一原因是不允许向下转换。所以,我必须通过在类A中使用override getters来获取一些实例的小部分。此解决方法有几个问题。例如,一些getter在父类中没有意义,并且父类不能是抽象的。
任何更好的解决方案?
这里是一个Java编程情我愿看到任何可能的改进。得到一个子类的实例从一个集合 - Java的
B类是类A的一个子类B的一些实例是在集合。根据类型,我可以使用instanceof从集合中检索B类实例。但是,我不能将这些实例视为B类的实例,但是A类的唯一原因是不允许向下转换。所以,我必须通过在类A中使用override getters来获取一些实例的小部分。此解决方法有几个问题。例如,一些getter在父类中没有意义,并且父类不能是抽象的。
任何更好的解决方案?
而是为了做一些事情,让对象直接做询问信息的对象。例如,更换
int a = object.getA();
int b = object.getB();
int sum = a + b;
与
int sum = object.computeSum();
这样,如果子类没有getB()方法,因为它alsways视为0,它可以实现使用
方法computeSum()
return this.a;
对不起,这个愚蠢的例子,但是这想法。添加行为到你的对象,而不是让他们与getter和setter的数据结构。如果你发布一个你必须做的具体事例,我可以提供更多帮助。要做到这一点,而不铸造
我明白你的意思,这是我们使用instanceof时遇到的一个问题。但是,检索子类的实例是在API外面。 – vic
的一种方法是使用visitor pattern。这在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);
}
}
感谢您的建议。我们的使用场景没有填写设计模式意图。一个有趣的人,但。 – vic
你为什么认为,你不能做下降?你试过了吗?并且请张贴一些代码来证明你正在尝试做什么。 –
请放一些代码。 –
您可以使用子类进行强制转换,但必须确定它是该子类的一个实例。 –