[英]OOP Basics: Creating overridden object in base-ctor from derived class
抱歉標題不好,但我的英語不太好。
假設以下代碼(在程序模式下使用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();” 顯然會在Console中輸出“BaseClassSetting”。
讓我們從BaseClass中派生出一個類:
public class InheritedClass : BaseClass
{
public new class Settings : BaseClass.Settings
{
public string InheritedClassSetting { get { return "InheritedClassSetting!"; } }
}
}
調用“new InheritedClass()。PrintSettings();” 仍然會在Console中打印“BaseClassSetting”。
使代碼使用“new”ed InheritedClass.Settings的唯一方法是添加一個類似的ctor
public InheritedClass()
{
this.settings = new Settings();
}
使用這個額外的ctor,它將所需的“InheritedClassSetting,BaseClassSetting”輸出到控制台。
現在的問題是:是否可以使BaseClass-ctor始終使用實例對象的Settings-Class? (不在派生類中添加ctor)
對於不良做法,預計會遇到問題的不良解決方法。 我不會一般使用new
關鍵字,更不用說嵌套類了。 您可以通過使基類接受繼承自BaseClass.Settings
和無參數構造函數的泛型類型來刪除繼承類中的構造函數。 顯然,這是不可讀的。
public class BaseClass<T> where T : BaseClass<T>.Settings, new()
{
protected Settings settings;
public BaseClass()
{
settings = new T();
}
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."; }
}
}
}
public class InheritedClass : BaseClass<InheritedClass.Settings>
{
public new class Settings : BaseClass<InheritedClass.Settings>.Settings
{
public string InheritedClassSetting
{
get { return "InheritedClassSetting!"; }
}
}
}
注意在線:
public new class Settings : BaseClass<InheritedClass.Settings>.Settings
泛型的參數不要求您指定InheritedClass
。 我添加它因為它已經非常令人困惑,我不想讓它變得更糟。
不,因為你不能擁有“虛擬類型”。
有幾種方法可以嘗試實現您在此處所做的操作,但是所有這些方法都需要InheritedClass
在某些時候顯式引用它自己的Settings
版本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.