На самом деле я рефакторинг какой-то части кода.
что я хочу сделать, это инициализировать объект «Задача» с объектом «TaskArgument».
скажем, «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" общедоступен, а метод "Initialize" работает только с "Task".
поэтому я перенес проверку типов в другое место (в будущем).
Есть ли лучшая практика или хорошая идея дизайна.
... "внутренняя публика" ... ммхмммм?
Еще одна сумасшедшая идея - внутренний класс, но мне они не нравятся, и это делает такой простой случай более сложным или нет:
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»?
прошу прощения за мои плохие знания английского
привет
мо