-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 に答える