実際、コードの一部をリファクタリングしています。私がやりたいのは、オブジェクト「TaskArgument」でオブジェクト「Task」を初期化することです。「TaskArgument」が抽象的で、「Task」がメソッド「OnEnterTask(TaskArgument args)」を実装し、封印されているとしましょう (既存のシステムのいくつかの特別な動作のため、範囲外です)。
古いコード:
public sealed class Task : SomeSystemBaseTask {
private int accessMe;
private int meToo;
public void OnEnterTask(TaskArgument args) {
if (args is SimpleTaskArgument) {
accessMe = ((SimpleTaskArgument)args).uGotIt;
meeToo = 0;
} else if (args is ComplexTaskArgument) {
accessMe = ((ComplexTaskArgument)args).uGotItValue * ((ComplexTaskArgument)args).multiplier;
meToo = ((ComplexTaskArgument)args).multiplier - 1;
}
}
}
タイプチェックを避けるベストプラクティスは何ですか? 私の最初の馬鹿げた考えは:
public abstract class TaskArgument {
internal public abstract Initialize(Task args);
}
public class SimpleTaskArgument : TaskArgument {
public int uGotIt = 10;
internal public Initialize(Task task){
task.accessMe = uGotIt;
}
}
public class ComplexTaskArgument : TaskArgument {
public int uGotItValue = 10;
public int multiplier = 10;
internal public Initialize(Task task){
task.accessMe = uGotItValue*multiplier;
task.meToo = multiplier - 1;
}
}
public sealed class Task : SomeSystemBaseTask {
public int accessMe;
public int meToo;
public void OnEnterTask(TaskArgument args){
args.Initialize(this);
}
}
しかし、私の「accessMe」は公開されており、「初期化」メソッドは「タスク」でのみ機能します。そのため、タイプチェックを別の場所に移動しました(将来的に)。ベスト プラクティスや優れた設計アイデアはありますか。
...「内部公開」...うーん?
別のクレイジーなアイデアは内部クラスでしたが、私はそれらが好きではなく、そのような単純なケースをより複雑にするか、そうではありません:
public abstract class TaskArgument {
internal public abstract Initialize(ITaskWrapper wrapper);
}
public class SimpleTaskArgument : TaskArgument {
...
}
public class ComplexTaskArgument : TaskArgument {
...
}
public interface ITaskWrapper {
public int AccessIt { set; get; }
...
}
public sealed class Task : SomeSystemBaseTask {
private int accessMe;
...
class TaskWrapper : ITaskWrapper {
...
}
public void OnEnterTask(TaskArgument args){
args.Initialize(new TaskWrapper(this));
}
}
「TaskArgument」の指定されたタイプに基づいている場合、初期化に最適な場所はどこですか?
私の悪い英語の知識を親切に許してください
こんにちは