根据收到的子类做不同事情的模式?

问题描述 投票:0回答:1

目前我有类似于以下数据类的东西,我希望

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# 语言功能分派到正确的实现。我怀疑也许可以使用策略模式,但我担心这对于这个小东西来说有点沉重。

c# design-patterns polymorphism
1个回答
0
投票

对我来说,更改基类的设计更有意义。
将这些用例分成不同的类似乎并不高效或不明智。有一个基类可以同时执行这两种操作,如果您确实需要,您可以派生成员并将其标记为已过时。

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();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.