【问题标题】:Implicitly passing parameter to base constructor将参数隐式传递给基本构造函数
【发布时间】:2016-05-17 17:35:32
【问题描述】:

我有一个看起来像这样的课程:

public class WidgetDao : AbstractDao<Widget>, IWidgetDao
{
    public WidgetDao(ISession session)
        : base (session)
    {

    }
}

如果我尝试在如下代码中删除此构造函数,我的代码会出现构建错误:

public IWidgetDao GetWidgetDao()
{
    return _widgetDao ?? (_widgetDao = new WidgetDao(_session));
}

我有点理解我得到构建错误的原因......没有明确的WidgetDao 构造函数接受一个参数。但是,WidgetDao 继承自 AbstractDao&lt;Widget&gt;,它确实有一个带有一个参数的构造函数。

我不明白为什么 C# 编译器会在 WidgetDao 上创建一个显式构造函数,而它只是用于将参数传递给基类。

有人可以帮我解释一下吗?

【问题讨论】:

  • “我不明白为什么 C# 编译器会在 WidgetDao 上创建一个显式构造函数,而它只是用于将参数传递给基类。”因为构造函数不是继承的,基本上......并且有充分的理由说明它们被继承......否则每个类都会以无参数构造函数结束,因为object 有一个无参数构造函数, 例如。基本上,不要尝试删除该构造函数。
  • 这很公平。当我到处都有几乎空的构造函数时,我只是对我的代码有点怀疑。感谢您的回复。随时提交它作为答案。

标签: c# constructor


【解决方案1】:

不幸的是,没有办法自动执行此操作。 C# 将为您的对象提供的唯一隐式构造函数是默认的无参数构造函数,并且只有在您的代码中没有替代方法时才会这样做。我稍后会在此基础上进行构建,但只是为了基础信息......

隐式MyClass()构造函数:

public class MyClass 
{
}

在上面的例子中,编译器假设你想要一个公共的无参数构造函数,它除了允许你创建一个对象之外并没有真正做任何事情。即使您没有创建构造函数,您也可以整天调用new MyClass()

现在,当您创建自己的构造函数时会发生什么?

public class MyClass
{
    public MyClass(string name)
    {
        Name = name;
    }

    public string Name { get; private set; }
}

在这种情况下,隐式无参数构造函数仍然存在,但现在它是私有的。这意味着您不能再致电new MyClass(),您需要提供姓名。

现在让我们的类成为一个抽象基类:

public abstract class AbstractMyClass
{
    protected AbstractMyClass(string name)
    {
        Name = name;
    }

    public string Name { get; private set; }

    public abstract void DoSomething();
}

没有办法实例化一个抽象类,所以最好让你的构造函数protected。即使您将它们设为public,您也无法直接访问它们。重要的是同样需要注意:默认的无参数构造函数现在是私有的。任何实现此基类的类都必须为name 提供值,否则该类未完全实例化。

public class SeansClass
{
    public SeansClass() : base("Sean") { }

    public void DoSomething() { }
}

在这种情况下,我们重新引入了标准的无参数构造函数,并让它为我们的类提供name。这是完全有效的代码。 唯一需要注意的是,base() 调用中提供的值必须是编译时间常数根据传递给您的类的参数计算。 em> base() 方法总是首先被评估。

C# 无法假设您实际上希望基类的所有实现都具有相同的构造函数。每个类都可以添加构造函数或为基类提供自己的值。这只是 C# 的一个限制。

【讨论】:

    猜你喜欢
    • 2019-01-06
    • 2023-04-04
    • 1970-01-01
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多