【问题标题】:calling both base() and this() constructors [duplicate]调用 base() 和 this() 构造函数[重复]
【发布时间】:2014-01-30 15:07:53
【问题描述】:

我已经看过,但并没有发现与我正在处理的内容相似。希望有一个解决方案,或提供更好的实施方案。我有一个类,可以通过一个可选参数传递给创建的实例。然后我有一个具有类似可选参数的派生类,但在其非参数构造函数中,无论可选参数如何,都会进行其他准备工作。让它调用基类参数构造函数的正确方法是什么,但仍然执行派生的非参数构造函数。

public class MyBaseClass
{
   protected object preserveParm;
   protected int someValue;

   public MyBaseClass()
   {
      someValue = 1;
   }

   public MyBaseClass( object SomeParm ) : this()
   {
      preserveParm = SomeParm;
   }
}

public class DerivedClass : MyBaseClass
{
   private int customSecondaryProp;
   private DateTime when;

   public DerivedClass()
   {
      customSecondaryProp = 10;
      someValue = 5;
   }

   public DerivedClass( object SomeParm ) : base( SomeParm )
   {
      when = DateTime.Now;
   }
}

所以,如果我做一个

DerivedClass test = new DerivedClass( "testing" );

我需要它来访问基类以保留参数,但还需要访问派生类的非参数来设置示例假值。

现在,Derived 参数方法被命中,然后命中基类的参数构造函数,该构造函数调用基类的“this()”,并将链返回到 DerivedClass 参数构造函数,完成自身,但从未命中 DerivedClass 构造函数。有没有办法同时强制基类无参数和 DerivedClass 无参数构造函数?

【问题讨论】:

  • 我通常会让非参数化构造函数调用具有合适值的参数化构造函数,而不是你这样做的方式。然后所有逻辑都在(类的)参数化最多的构造函数中结束,它可以调用最合适的基类构造函数(然后,如果需要,可以再次填充省略的参数以调用其最参数化的形式)跨度>
  • @Damien_The_Unbeliever,从来没有想过相反的事情,因为实际传入的对象比简单的“对象”更复杂,但会调查它。谢谢。
  • @nawfal,对于已经选择了解决方案的问题,不要费心尝试将 cmets 回填到重复项……在我看来只是浪费。

标签: c# inheritance constructor


【解决方案1】:

你似乎想要这样的东西:

public DerivedClass( object SomeParm ) : base( SomeParm ), this()

但这在 C# 中是不可能的:see this answer for details 我建议您在方法中实现 Derived 构造函数初始化,并在两个构造函数中手动调用它:

public class DerivedClass : MyBaseClass
{
    private int customSecondaryProp;
    private DateTime when;

    private void InitializeDerivedClass()
    {
        customSecondaryProp = 10;
        someValue = 5;
    }

    public DerivedClass()
    {
        InitializeDerivedClass();
    }

    public DerivedClass(object SomeParm): base(SomeParm)
    {
        InitializeDerivedClass();
        when = DateTime.Now;
    }
}

如果可能,您还可以使用以下语法进行初始化:

    private int customSecondaryProp = 10;

【讨论】:

  • 呵呵,这正是我刚刚回答的。你是第一个,所以 +1,我已经删除了我的答案。 :)
【解决方案2】:

为什么不在这里只使用可选参数来强制类型只有一个构造函数。

public DerivedClass(object SomeParam = null) : base(SomeParam) {
  customSecondaryProp = 10;
  someValue = 5;
  if (SomeParam != null) { 
    when = DateTime.Now;
  }
}

public MyBaseClass(object SomeParam) {
  someValue = 1;
  preserveParam = SomeParam;
}

【讨论】:

  • 因为不管参数我要设置其他的东西,所以类不REQUIRE参数。
  • @DRapp 这就是可选参数为您提供的。可以用new DerivedClass()new DerivedClass(someObj)调用
【解决方案3】:
public DerivedClass():base(null)

您可以将 Null 发送给参数构造函数

【讨论】:

    猜你喜欢
    • 2019-02-01
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 2015-10-30
    • 1970-01-01
    相关资源
    最近更新 更多