实际上我重构了部分代码。我想做的是用对象“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”的给定类型进行初始化的最佳位置在哪里?
请原谅我糟糕的英语知识
问候莫