实际上,我重构了代码的一部分。 我想要做的是用对象“TaskArgument”初始化一个对象“任务”。 让我们说“TaskArgument”是抽象的,“Task”实现了一个方法“OnEnterTask(TaskArgument args)”并且被封闭(对于现有系统的一些特殊行为,它超出了范围)。c中的友好类#
旧代码:
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;
}
}
}
这将是最好的做法避免了类型检测? 我的第一个stupud想到的是:
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”是公众和“初始化”方法只能用“任务”的作品。 所以我将类型检查移到了另一个地方(将来)。 是否有任何最佳实践或良好的设计理念。
...“内部公开”... mmhhmm?
另一个疯狂的想法是一个内部类,但我不喜欢那些和它作出这样的简单情况更加复杂或不:
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”?
请多原谅我的英语不好知识
问候 月
我认为这适用于简单的初始化 – 2010-03-10 16:12:41
@mo,是的我的例子适用于简单的初始化。但它看起来像你在上面创建一个依赖关系网络。我认为让Task类接受TaskArg对象是一种嗅觉,然后在TaskArg上调用它自己传递的初始值(this)。这是一个尴尬的双向依赖。分开你的担忧!如果您需要执行使用Task和TaskArgs状态的计算,则将Task和TaskArgs保留为仅状态类(具有最小的业务逻辑)。然后创建另一个知道两者(但他们不知道它)的类并在那里执行计算。 – manu08 2010-03-10 16:28:38
适合我:)这可能是最干净的方式。 – 2010-03-10 16:41:11