简单的构造函数和构造函数与base有什么区别?

时间:2013-05-30 10:40:40

标签: c#

我对以下代码有疑问,

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

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

上述代码之间有什么区别?

疑惑:

1.必须调用基础构造函数

2.调用基础构造函数的用途

3.如果我们没有调用基础构造函数,则会隐式调用。

任何人请为此提供建议。

6 个答案:

答案 0 :(得分:4)

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

对你的问题;这一切都取决于是否有意义使用传递的元素初始化BaseClass。

  1. 并非总是如果你没有指定任何东西,那么将调用base()
  2. base()就像你已经做的那样

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

请使用chained contructors

注意2件事
  1. 基本构造函数在实际构造函数之前始终称为
  2. 构造函数可以具有不同的可访问性,如私有或公共。您不能将每个构造函数从基类链接到派生类。

答案 4 :(得分: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)指定并将参数传递给基础构造函数。

答案 5 :(得分: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的合理实例所需的一切。构造函数的工作是确保发生这种情况。倾向于尽可能多地调用基础构造函数。