1

我对下面的代码有一些疑问,

public class ClassA: BaseClass
{
    public ClassA(UIElement element)
        : base(element)
    {
    }
}

public class ClassA: BaseClass
{
    public ClassA(UIElement element)
    {
    }
}

上面的代码有什么区别?

疑点:

1.需要调用基础构造函数

2.调用基础构造函数有什么用

3.如果我们不调用基本构造函数,它会隐式调用。

请任何人为此提供建议。

4

6 回答 6

4

第一个指示使用BaseClass(UIElement)构造函数,而另一个将用于BaseClass()初始化。

对您的问题;这完全取决于用传递的元素初始化 BaseClass 是否有意义。

  1. 并非总是如此,如果您未指定任何内容,则将调用 base()
  2. base() 就像你已经做过的那样
  3. 是的
于 2013-05-30T10:41:50.747 回答
1

在每种情况下,都会调用基本构造函数,只是隐式调用,并在后一种情况下使用默认值 - 在第一种情况下,它使用接受参数的显式基本构造函数。如果基类上不存在默认的无参数构造函数,那么如果用户没有显式调用它以提供所需的输入,则会遇到错误。

因此,只有在需要将输入传递给特定构造函数或未定义默认公共构造函数时才需要调用。

于 2013-05-30T10:46:29.390 回答
0

第一个将参数传递给基本构造函数,而第二个使用默认值(无参数构造函数)。

public class Human
{
    public string Name { get; set; }
    public Human()
    {
        Name = "No name";
    }
    public Human(string name)
    {
        Name = name + " Jr.";
    }
}
public class Male : Human
{
    public Male() {}
    public Male(string name) : base(name) {}
}
public class Female : Human
{
    public Female() { Name = "Girl"; }
}


var unnamedHuman = new Human();
//unnamedHuman.Name == "No name"
var namedHuman = new Human("Jon");
//namedHuman.Name == "Jon"

var unnamedMale = new Male();
// unnamedMale.Name == "No name"
var namedMale = new Male("Chris");
// namedMale.Name == "Chris Jr";

var unnamedFemale = new Female()
// unnamedFemale.Name == "Girl"

逻辑:当你初始化一个子类(通过调用它们的ctor)时,首先它的基类构造函数被按顺序调用(自上而下),最后一个是你调用的子类的构造函数。默认情况下,使用默认的无参数构造函数,但您可以使用base(parameter1, p2).

于 2013-05-30T11:02:19.913 回答
0

如果你BaseClass看起来像:

public class BaseClass
{
    private readonly _element;
    public BaseClass(UIElement element)
    {
       _element = element;
    }
}

然后您绝对必须调用基本构造函数,因为它是唯一BaseClass具有的构造函数。

如果它看起来像这样:

public class BaseClass
{
    private readonly _element;
    public BaseClass()
    {
        _element = default(UIElement);
    }
    public BaseClass(UIElement element)
    {
       _element = element;
    }
}

如果要设置元素,则绝对必须调用基本构造函数,因为它只能在构造函数中设置。

如果它看起来像这样:

public class BaseClass
{
    private _element;
    public BaseClass()
    {
        _element = default(UIElement);
    }
    public BaseClass(UIElement element)
    {
       _element = element;
    }
    public UIElement Element
    {
      get{ return _element; }
      set{ _element = value; }
    }
}

然后你可以选择:

public class ClassA: BaseClass
{
    public ClassA(UIElement element)
        : base(element)
    {
    }
}

public class ClassA: BaseClass
{
    public ClassA(UIElement element)
    {
       Element = element;
    }
}

但是,前者更清晰,并且在整体构建过程中没有Element返回默认值( )的时间段。null

总之,认为这ClassA一种 BaseClass. ClassA在创建BaseClass. 确保这种情况发生是构造函数的工作。尽可能多地调用基构造函数是有意义的。

于 2013-05-30T11:24:21.507 回答
0

1-3。不,如果基类包含没有参数2的构造函数,它没有必要自动调用它。当你从另一个类继承时使用基类,你继承的部分也需要构造,所以你必须调用基类构造函数

于 2013-05-30T10:48:34.053 回答
0

请注意另外两件事chained contructors

  1. 基本构造函数总是在实际构造函数之前调用。
  2. 构造函数可以具有不同的可访问性,例如私有或公共。您不能将每个构造函数从基类链接到派生类。
于 2013-05-30T10:52:14.307 回答