【问题标题】:Two constructor calls inside one constructor in C# [duplicate]C#中一个构造函数内的两个构造函数调用[重复]
【发布时间】:2019-11-30 00:08:32
【问题描述】:

我知道如何为同一个类或基类的构造函数调用另一个构造函数,但是我怎样才能同时做到这两个呢?这是我希望实现的示例,并指出在实际情况下,我们可能想做一些比设置属性更复杂的事情:

public class BaseClass
{
    public BaseClass(object param)
    {
        // base constructor
    }
}

public class DerivedClass
{
    DateTime Date { get; private set; }

    public DerivedClass()
    {
        Date = GenerateDate();
    }
    public DerivedClass(object param) : base(param)
    {
        // How do I make it call DerivedClass() ?
    }
}

【问题讨论】:

  • 这看起来像 Basic Constructor Chaning:public DerivedClass() : this(someDefaultForTheParam)public DerivedClass(object param) : this()。我不确定结合基类调用和链接操作的顺序,但毕竟只有两个选项。
  • 很确定你不能在一个派生自一个没有一个类的类上使用无参数构造函数......你必须使它成为 BaseClass(object param = null) 或类似的东西。
  • 用方法包装公共语言并从两个构造函数调用方法
  • 在实际情况下,我们可能想做一些比设置属性更复杂的事情 - 这可能是一个好兆头,可能更复杂的事情可以提取到自己的方法中/类
  • @HereticMonkey: “你不能在一个派生自一个没有参数的类上使用无参数构造函数”——严格来说不是这样。这很困难,因为通常基类的参数将由客户端代码提供。但是如果派生类有合理的方式给基类提供参数,那它当然可以声明一个无参构造函数。

标签: c# constructor base


【解决方案1】:

这段代码实际上是在 Sharp Lab 中编译的。并不是说我必须解决一些次要的问题。

using System;

public class BaseClass
{
    public BaseClass(object param)
    {
        // base constructor
    }
}

public class DerivedClass : BaseClass
{
    public DateTime Date { get; private set; }

    public DerivedClass() : this(new object()) { }

    public DerivedClass(object param) : base(param)
    {
        //Do Date = GenerateDate(); here
        //Had to cut your pseudo code, as it broke compilation
    }
}

你搞错了:你需要DerivedClass() 才能调用DerivedClass(object param)。对于多个构造函数,您实际编写的代码始终是具有 most 参数的那个。所有其他构造函数只是在那里链接到它,每一步都给出一个默认值。

【讨论】:

  • 虽然这并没有解决我的问题,但它让我意识到我没有问对正确的问题。对于我提出的案例,这确实解决了问题,唯一的例外是我会使用null 而不是new object()。标记为已接受的答案。
  • @DCD 我不得不猜测一个默认值,并且在任何实例或空值之间被撕裂。但最终,默认值可以是您想要的任何值。
猜你喜欢
  • 2015-07-02
  • 1970-01-01
  • 2017-01-05
  • 1970-01-01
  • 1970-01-01
  • 2014-08-01
  • 2011-03-24
  • 2016-03-05
  • 2018-10-17
相关资源
最近更新 更多