我遇到这种情况:
public abstract class ClassA{
public ClassA getClassOfSameKind(){
return this.getClass().newInstance();
}
}
public abstract class ClassB extends ClassA{
public void doSomethingSpecial(){
ClassB otherClass = (ClassB) this.getClassOfSameKind();
//do something special that only Class B can do
}
}
你会采用不同的方式吗?
答案 0 :(得分:2)
使用协变返回类型可以避免强制转换:
public abstract class ClassA{
public abstract ClassA getClassOfSameKind();
}
public abstract class ClassB extends ClassA{
@Override
public abstract ClassB getClassOfSameKind();
public void doSomethingSpecial(){
ClassB otherClass = this.getClassOfSameKind();
//do something special that only Class B can do
}
}
public class ClassC extends ClassB {
@Override
public ClassC getClassOfSameKind() {
return new ClassC();
}
}
答案 1 :(得分:2)
如果你想避免那种类型转换,那么你可以这样写:
public void doSomethingSpecial(){
ClassB otherClass = this.getClass().newInstance();
// ...
}
......或其他方式。
但说实话,除非代码包含大量调用需要进行类型转换的getClassOfSameKind()
方法,否则我不会打扰。
是否表明设计不好?
IMO,不。当然,不是一般的。
在某些情况下,它们是,特别是当类型转换硬连接假设某个对象具有特定类型而没有合理的基础时。例如:
private ClassB otherB;
public void setOther(ClassA other) {
this.otherB = (ClassB) otherB; // It's always a ClassB. She'll be right ...
}