【问题标题】:What does it mean to "override" the ctor of ServiceBase?“覆盖” ServiceBase 的 ctor 是什么意思?
【发布时间】:2019-07-19 19:58:00
【问题描述】:

我最近开始使用 winservices,我偶然发现了 this link 关于 winservice ctor 的内容,它谈到了“覆盖”ServiceBase 构造函数。 感觉很愚蠢,我用谷歌搜索了这意味着什么,并偶然发现了this。 问题:他们实际上在文档中说“覆盖”是什么意思?明确地链接回 ServiceBase ctor?

【问题讨论】:

  • 文档有点误导。它只是意味着为你的新类提供一个构造函数。构造函数不是虚拟的,所以你不能覆盖它(一个在 C# 语言中已经有意义的词)。
  • .NET 中的 general 规则的措辞非常糟糕。如果您的类中有任何构造函数,则必须确保它们链接回基类中的构造函数。由于这个类只有一个构造函数,所以没有太多选择要链接回哪个构造函数。 (在:objectbase() 周围插入所有标准默认值)。所以我完全不知道他们为什么叫出来。

标签: c# constructor windows-services


【解决方案1】:

我不太同意 MS 所说的。 ServiceBase 有一个空的默认构造函数,它将自动被调用,因此您必须覆盖它的语句(这也不正确,我会 overloading 而不是 overriding em>) 不是真的。 但是,我他们的意思是像这样调用基本构造函数

public class MyService : ServiceBase {
    public MyService(var something) : base(){

    }
}

相同
public class MyService : ServiceBase {
    public MyService(var something){

    }
}

/edit:理论上,如果您要重载(而不是覆盖)基本构造函数,则必须显式调用它。

public class ServiceBase{
    public ServiceBase(){

    }

    public ServiceBase(var something) {

    }
}
public class MyService : ServiceBase {
    public MyService(var something)
        : base(something) 
    {

    }
}

但是,无法重载ServiceBase 构造函数,因为该类未标记为partial

【讨论】:

  • 谢谢,我想他们只是想告诉我们做“最低限度”(“你需要在构造函数中为从 ServiceBase 继承的类实现的最低限度是在你的组件上设置 ServiceName。 ") 我实际上并没有这样做。
【解决方案2】:

MS 只是声明如果你从 ServiceBase 派生(像这样),你应该调用基本构造函数

class MyService:ServiceBase
public MyService : base() {
.. custom code ..
}

除了新的 .ctor 之外,这还将调用基本构造函数。 在这里查看“覆盖”.ctor: C# - Making all derived classes call the base class constructor

【讨论】:

    猜你喜欢
    • 2016-05-28
    • 2018-11-02
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    相关资源
    最近更新 更多