Var*_*n K 5 c# oop inheritance
构造函数按照从上到下依次执行IE基础的顺序执行,然后是派生的.这个安排是基于一个重要的OOP保证,即一个对象(这里是base)必须始终在它被使用之前被初始化(这里是派生类的构造函数).
我想知道为什么字段初始化程序在C#中不遵循这个原则?我在这里错过了什么吗?
我已经通过字段初始化器遇到了这个原理的有用性.我有一个基类,其属性返回Identity对象.每个派生类都有自己的存储库字段,我一直使用field-initializer初始化(使用默认构造函数).最近我决定还必须为存储库类提供Identity对象,因此我在存储库构造函数中引入了一个额外的参数.但我坚持要发现:
public class ForumController : AppControllerBase
{
ForumRepository repository = new ForumRepository(Identity);
// Above won't compile since Identity is in the base class.
// ... Action methods.
}
Run Code Online (Sandbox Code Playgroud)
现在我只剩下一个选项,即使用默认构造函数来填充我的每个控制器,仅用于使用Identity初始化存储库对象.
为什么派生类的字段初始值设定项在基类字段初始值设定项之前执行?
好问题.我在2008年的这些博文中回答了你的问题:
字段初始化程序在构造函数中执行,并且由于首先调用基类中的构造函数,因此所有字段初始化程序也会在派生构造函数执行之前执行。
例子:
public class Base {
// field initialiser:
private string _firstName = "Arthur";
public string FirstName { get { return _firstName;}}
public string LastName { get; private set; }
// initialiser in base constructor:
public Base() {
LastName = "Dent";
}
}
public class Derived : Base {
public string FirstNameCopy { get; private set; }
public string LastNameCopy { get; private set; }
public Derived() {
// get values from base class:
FirstNameCopy = FirstName;
LastNameCopy = LastName;
}
}
Run Code Online (Sandbox Code Playgroud)
测试:
Derived x = new Derived();
Console.WriteLine(x.FirstNameCopy);
Console.WriteLine(x.LastNameCopy);
Run Code Online (Sandbox Code Playgroud)
输出:
Arthur
Dent
Run Code Online (Sandbox Code Playgroud)