-4

我有这种情况:

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
    }

}

你会做不同的事情吗?

4

2 回答 2

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();
    }
}
于 2013-02-17T01:11:19.083 回答
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 ...
}
于 2013-02-17T01:11:36.753 回答