如果没有可用的重载构造函数,调用基类的构造函数有什么用
本文关键字:构造函数 基类 什么 调用 重载 如果没有 | 更新日期: 2023-09-27 17:57:13
我们有什么优势吗,或者只是传统地调用像#1这样的基类构造函数,#1 和 #2 都不同吗?(当我碰巧有 BaseClass 的重载构造函数时,我使用了 #2,但为什么我们)。
public class BaseClass
{
public BaseClass()
{
Console.WriteLine("From Base");
}
}
#1
public class DerivedClass
: BaseClass
{
public DerivedClass()
:base()
{
Console.WriteLine("From Derived");
}
}
#2
public class DerivedClass
: BaseClass
{
public DerivedClass()
{
Console.WriteLine("From Derived");
}
}
不,没有区别。在情况 #2 中,编译器将生成对基类构造函数的调用(如果有无参数基类构造函数可用,即)。手动添加此类调用是一个样式问题。仅当没有可用的无参数基类构造函数时,它才是必需的,因此编译器无法自行决定如何调用它。
它们基本上是一样的。如果未指定任何内容,则会隐式调用基类的无参数构造函数。
这也是为什么如果基类没有无参数构造函数,#2 会给你一个错误。(#1 也会,但 #2 给你一个错误的事实告诉你,即使你没有指定对它的调用,它也会尝试调用一个无参数的基构造函数)
通常,如果派生类特别需要基类的构造函数在其之前运行,我通常使用 #1。实际上,编译器没有区别,但它更清楚地表明存在依赖关系。如果您考虑移植到其他平台,这可能非常相关。例如,在 Delphi 中,构造函数不会调用基类的构造函数,除非您明确告诉它;如果我将代码移植到 Delphi,我更有可能记住使用 #1 来做到这一点。
例如,如果基类实例化一个列表,并且派生添加到其中,我会使用 #1。如果派生构造函数只是初始化一个局部字段,我会使用 #2。
没有区别。: base()
语法存在的原因是,您可以调用非默认构造函数(带参数)。如果不能以相同的方式调用默认构造函数,那将感觉很武断。