我对以下代码有疑问,
public class ClassA: BaseClass
{
public ClassA(UIElement element)
: base(element)
{
}
}
public class ClassA: BaseClass
{
public ClassA(UIElement element)
{
}
}
上述代码之间有什么区别?
疑惑:
1.必须调用基础构造函数
2.调用基础构造函数的用途
3.如果我们没有调用基础构造函数,则会隐式调用。
任何人请为此提供建议。
答案 0 :(得分:4)
第一个指示使用BaseClass(UIElement)
构造函数,而另一个将使用BaseClass()
来初始化。
对你的问题;这一切都取决于是否有意义使用传递的元素初始化BaseClass。
答案 1 :(得分:1)
在每种情况下,只是隐式地调用基础构造函数,并在后一种情况下使用默认值 - 在第一种情况下,它使用接受参数的显式基础构造函数。如果基类上不存在默认的无参数构造函数,那么如果用户未显式调用它以提供所需的输入,则会遇到错误。
因此,只有在需要将输入传递给特定构造函数或者未定义默认公共构造函数时才需要调用。
答案 2 :(得分:0)
1-3。不,如果base calss包含没有参数的构造函数,它就没有必要自动调用它 2.当你从另一个类继承时使用base,你继承的部分也需要构造,所以你必须调用基础构造函数
答案 3 :(得分:0)
请使用chained contructors
答案 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
的合理实例所需的一切。构造函数的工作是确保发生这种情况。倾向于尽可能多地调用基础构造函数。