提问人:CodeNinja 提问时间:6/1/2023 最后编辑:CodeNinja 更新时间:6/1/2023 访问量:33
如何从子类更改基本参数的初始状态
How to change initial state of base parameter from sub class
问:
我正在构建一个运行“任务”的应用程序。所有任务 inherrit,其中包含一些默认逻辑/函数,这些逻辑/函数应该可用于所有任务,如 、 和 函数。BaseTask
Start
Stop
Enable
Disable
基类还应该包含一些属性,用于指示任务是否处于活动状态,因为只能启动“活动”任务。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
- 我想使用函数和
BaseJob
Enable
Disable
- 我想保证只能使用相关函数来更改 propert,因为它们可能包含更多的逻辑,而不仅仅是切换“活动”布尔值。
active
BaseJob
- 我想使用函数和
我已经尝试了不同的方法,但在第八种情况下,我遇到了另一个问题。
private bool active
在 BaseJob 中不起作用,因为它无法从子类访问和覆盖(这是正确的工作吗? :'-D )。- 使用抽象 getter/setter 无法完成这项工作,因为它不能在 BaseJob 类中包含默认值
- 受保护的 getter 和 setter 或 bool 不起作用,因为我不知道如何覆盖子类中的默认值。
protected virual bool active
在不起作用。“修饰符”虚拟“对此项目无效”是我收到的错误。BaseJob
我看到的可能解决方案: 可能我需要覆盖设置默认值的构造函数,不是吗?我实际上想避免这种情况,但我认为这是唯一的选择?
答:
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 class
false
That 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.
评论
protected virtual bool active
BaseJob
BaseJob
BaseJob
abstract
protected virual bool active
public abstract class...