这是Java编程的情况,我希望看到任何可能的改进。

B类是A类的子类。B的某些实例在Collection中。根据类型,我可以使用instanceof从集合中检索B类实例。但是,我不能将这些实例视为B类的实例,但是A类仅作为此类实例,因为不允许向下转换。因此,我必须通过使用类A中的重写getter来获取一些实例实例。这种解决方法存在一些问题。例如,某些吸气剂在父类中没有意义,并且父类不能是抽象的。

有更好的解决方案吗?

最佳答案

一种无需强制转换的方法是使用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);
    }
}

08-18 10:20
查看更多