【发布时间】:2020-04-18 01:21:04
【问题描述】:
好的,所以我有两个简单的类,Person 和 Employee。
人:
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public Person(string firstName, string lastName)
{
FirstName = firstName;
LastName = lastName;
}
}
员工:
public class Employee : Person
{
public string DepartmentName { get; set; }
}
简单吧?员工继承人,但有问题。员工类给我一个错误,说必须调用父类的构造函数。现在一个类似问题的答案说我应该调用基类的构造函数,它会解决问题。它的作用。
我的问题是,当员工类本身没有自己的构造函数时,我为什么要调用基类的构造函数?
书名 MCSD Certification 70-483 说:
这个系统的一个奇怪之处是你可以创建一个 Employee 类 没有构造函数,即使它允许程序创建一个 Employee 类的实例而不调用 Person 类 构造函数。这意味着 Employee 的以下定义 类是合法的:
public class Employee : Person
{
public string DepartmentName { get; set; }
}
我的情况和这本书上写的完全一样。这本书说,如果孩子没有自己的,继承并且不调用基类的构造函数是合法的。为什么我仍然收到此错误?即使我有相同的实现。
这本 2018 年的书是否已过时/有错误?难道我做错了什么?还是 C# 中的新更新不允许子类不调用父类的构造函数?
【问题讨论】:
-
示例中的基类是否也有一个空的构造函数?比如:
public Person() : this(string.empty, string.empty) { } -
@Jimi 不,没有。
-
书错了。创建派生类的对象时,首先调用基类的构造函数,然后调用派生类的构造函数。如果没有构造函数,则会自动创建一个无参数的构造函数。如果定义了一个构造函数,那么你就不会得到一个自动无参数的构造函数。
-
所以在显示的代码中,Employee 有一个无参数的构造函数,但 Person 没有。从语义上讲,一个人必须有一个名字,一个员工就是一个人,因此一个员工必须有一个名字。
-
是的,这是一个错误,我已确认。 @iakobski
标签: c# oop inheritance constructor default-constructor