如何从子类更改基本参数的初始状态

How to change initial state of base parameter from sub class

提问人:CodeNinja 提问时间:6/1/2023 最后编辑:CodeNinja 更新时间:6/1/2023 访问量:33

问:

我正在构建一个运行“任务”的应用程序。所有任务 inherrit,其中包含一些默认逻辑/函数,这些逻辑/函数应该可用于所有任务,如 、 和 函数。BaseTaskStartStopEnableDisable

基类还应该包含一些属性,用于指示任务是否处于活动状态,因为只能启动“活动”任务。active

要对代码有一个想法,请执行以下操作:

// As i have no idea how to declare the active param to make it work, i describe this with a comment in my code.

public abstract class BaseJob {
  private Status jobStatus;
  // some active property defined here which is false by default

  public BaseJob() {
    jobStatus = active ? Status.initialized : Status.inactive;
  }
  
  public void Start() {
    if (active) {
      Run();
    }
  }

  public void Stop() {
    if (jobStatus == Status.running) {
      // logic to stop the job
    }
  }

  public void Enable() {
    // set "active" to true
    jobStatus.initialized
  }

  public void Disable() {
    Stop();
    // Set "active" to false
    jobStatus = Status.inactive
  }

  public void Run() {
    ..
    task();
    ..
    jobStatus = Status.running;
  } 

  public abstract void task() { }
}
public class JobA: BaseJob {
  public override void task() {
    // The logic of the specific job
  }
}

现在的问题是:

  • 如何定义活动属性,默认情况下是假的,但这样我就可以在子类中“覆盖”其默认值。考虑到:BaseJob
    • 我想使用函数和BaseJobEnableDisable
    • 我想保证只能使用相关函数来更改 propert,因为它们可能包含更多的逻辑,而不仅仅是切换“活动”布尔值。activeBaseJob

我已经尝试了不同的方法,但在第八种情况下,我遇到了另一个问题。

  • private bool active在 BaseJob 中不起作用,因为它无法从子类访问和覆盖(这是正确的工作吗? :'-D )。
  • 使用抽象 getter/setter 无法完成这项工作,因为它不能在 BaseJob 类中包含默认值
  • 受保护的 getter 和 setter 或 bool 不起作用,因为我不知道如何覆盖子类中的默认值。
  • protected virual bool active在不起作用。“修饰符”虚拟“对此项目无效”是我收到的错误。BaseJob

我看到的可能解决方案: 可能我需要覆盖设置默认值的构造函数,不是吗?我实际上想避免这种情况,但我认为这是唯一的选择?

C#

评论

1赞 Mong Zhu 6/1/2023
听起来您还没有尝试过基类。另外,请发布真实代码而不是伪代码。尤其是你的类的定义。是抽象的吗?如果不是,实例化对象的用例是什么?protected virtual bool activeBaseJobBaseJob
0赞 CodeNinja 6/1/2023
@MongZhu确实如此。我更新了我的帖子。我只是尝试了哪个不起作用。“修饰符”虚拟“对此项目无效”是我收到的错误。-- 关于伪/真实代码的事情,我认为我的伪代码接近我的真实代码,我只是没有添加逻辑和一些属性以使其更清晰/干净,因为它们与问题无关。BaseJobabstractprotected virual bool active
0赞 Mong Zhu 6/1/2023
“我的伪代码接近我的真实代码,我只是没有添加逻辑和一些属性”这很好,但我们需要看到真实的代码,如等等,以验证你的选择并评估你可能做错了什么public abstract class...
0赞 DavidG 6/1/2023
向我们展示您的实际代码,并确保它是一个最小的可重现示例
0赞 DavidG 6/1/2023
此外,请将帖子限制为包含一个问题。

答:

1赞 shingo 6/1/2023 #1

我认为您可以定义一个受保护的虚拟属性来表示初始活动状态。活动字段是私有的,因此只有基类才有可能更改它。

public abstract class BaseJob
{
    private bool _active;

    protected virtual bool IsActiveByDefault => false;

    public BaseJob()
    {
        _active = IsActiveByDefault;
    }
}

子类可以重写该属性以更改默认状态,而无需触及私有活动字段。

public class JobA: BaseJob
{
    protected override bool IsActiveByDefault => true;
}

评论

0赞 DavidG 6/1/2023
@CodeNinja 我们试图让你问一个好问题,这就是我们发表评论的原因。没有必要变咸。
0赞 DavidG 6/1/2023
这似乎是一种在构造函数中设置值的非常复杂的方法。例如 dotnetfiddle.net/QGE93s
0赞 CodeNinja 6/1/2023
@DavidG(第 1 部分)我认为你不明白我的问题(或者只是关注我是如何提出问题的)。Shingo 完全解决了我的问题/为我的问题提供了解决方案。他考虑到了我的所有担忧,这就像一个魅力。-=- 您的示例仅将值设置为子类构造函数中的基类 prop。
0赞 CodeNinja 6/1/2023
@DavidG(第 2 部分)这不能回答(单个)问题:因为它不是默认的。还有问题:不包括在内。How to define the active property in the BaseJob which is false by default but in such a way i can "override" its default value in a child classfalseThat I want to guarantee that the active propert can only be changed by using the related BaseJob functions as they may contain more logic than just toggle the "active" bool.