抱歉标题不好,但我的英语不是那么好。
假设以下代码(在程序模式下使用 LINQPad 进行测试):
public class BaseClass
{
protected Settings settings;
public BaseClass()
{
this.settings = new Settings();
}
public virtual void PrintSettings()
{
var t = settings.GetType();
Console.WriteLine(string.Join(", ", t.GetProperties().Select(pi => pi.Name)));
}
public class Settings
{
public string BaseClassSetting { get { return "BaseClassSetting."; } }
}
}
调用“new BaseClass().PrintSettings();” 显然会在控制台中输出“BaseClassSetting”。
让我们从 BaseClass 派生一个类:
public class InheritedClass : BaseClass
{
public new class Settings : BaseClass.Settings
{
public string InheritedClassSetting { get { return "InheritedClassSetting!"; } }
}
}
调用“new InheritedClass().PrintSettings();” 仍将在控制台中打印“BaseClassSetting”。
使代码使用“new”ed InheritedClass.Settings 的唯一方法是添加一个像
public InheritedClass()
{
this.settings = new Settings();
}
使用这个额外的ctor,它将所需的“InheritedClassSetting,BaseClassSetting”打印到控制台。
现在的问题是:是否可以让 BaseClass-ctor 始终使用实例对象的 Settings-Class?(不添加派生类中的ctor)