目前我有类似于以下数据类的东西,我希望
CreateScheduledEventRequest
的接收者在 ScheduleInfo 是 RepeatingTask 与 OneShotTask 时执行不同的操作:
public record CreateScheduledEventRequest
{
public ScheduleInfo ScheduleInfo = new OneShotTask();
}
public abstract record ScheduleInfo;
public record RepeatingTask : ScheduleInfo
{
public TimeSpan RepeatEvery;
}
public record OneShotTask : ScheduleInfo
{
public DateTimeOffset RunAt;
}
作为 OOP 设计的练习,我也想在不反思我收到的子类的情况下实现它。我天真地尝试为每个子类创建重载方法,但在使用基类调用它们时我没有设法取悦类型检查器。
我希望有一种方法可以让我编写一个采用 RepeatingTask 的方法,以及另一个采用 OneShotTask 的方法,然后以某种方式使用 C# 语言功能分派到正确的实现。我怀疑也许可以使用策略模式,但我担心这对于这个小东西来说有点沉重。
对我来说,更改基类的设计更有意义。
将这些用例分成不同的类似乎并不高效或不明智。有一个基类可以同时执行这两种操作,如果您确实需要,您可以派生成员并将其标记为已过时。
public abstract class ScheduleInfoBase
{
public virtual TimeSpan RepeatEvery { get; set; }
public virtual DateTimeOffset RunAt { get; set; }
public virtual bool RunOnce { get; set; }
protected virtual void RunAction(Action action)
{
if (RunOnce) {
// Execute once.
}
else {
// Configure repetition pattern and run.
}
}
}
public class ScheduleInfoRunOnce : ScheduleInfoBase
{
[Obsolete("Not implemented", true)]
public override TimeSpan RepeatEvery
{
get {
return default(TimeSpan);
}
set {
throw new NotImplementedException();
}
}
[Obsolete("Not implemented", true)]
public override bool RunOnce
{
get {
return true;
}
set {
throw new NotImplementedException();
}
}
protected override void RunAction(Action action)
{
//base.RunAction(action);
action();
}
}