次のクラス階層があるとします (基本インターフェイスが含まれています)。
IAction -> (abstract) BaseAction -> (concrete) ImmediateAction -> (concrete) MovementAction
さて、IAction がメソッドを公開するとしましょう (まあ、実際には IAction が実装する別のインターフェイスですが、ここでは物事を単純にしましょう!):
// Returns a new IAction instance deep copied from the current instance.
IAction DeepClone();
ここまでいい?ディープ コピー メソッドがあり、コピーImmediateAction
が必要ないくつかのプロパティがあるため、 の実装だけDeepClone()
でなく、コピー コンストラクターも提供します。
//Base Action implementation
protected BaseAction(BaseAction old)
{
this.something = old.something;
}
//Immediate Action Implementation
protected ImmediateAction(ImmediateAction old)
: base(old)
{
this.anything = old.anything;
}
public IAction DeepClone()
{
return new ImmediateAction(this);
}
MovementAction
ここで、関連するものがまったく内部にDeepClone()
ないため、メソッドまたはコピーコンストラクターを実装していないとしましょう。
私が抱えている問題はこれです:
IAction x = new MovementAction();
IAction y = x.DeepClone();
//pleaseBeTrue is false
bool pleaseBeTrue = y is MovementAction;
今、私はここで何が起こっているのか理解しています -MovementAction
は実装されていないためDeepClone()
、ImmediateAction.DeepClone()
代わりに呼び出され、 new をインスタンス化しますImmediateAction
。したがって、y
上記の例の の型はImmediateAction
ではなく ですMovementAction
。
この長い序文の後で、私の質問は次のとおりです。この種の状況でのベスト プラクティスは何ですか? 私は立ち往生していますか?階層に沿ったすべてのクラスに対して、何があってもメソッド を実装する必要がありますか? ここで使用しているパターンは間違っていますか?もっと良い方法がありますか?DeepClone()
最後に 1 つ: 可能であれば内省を避けたいと思います。