對不起,標題不好,但我的英語不太好。
假設下面的代碼(使用LINQPad在程序模式用於測試):OOP基礎知識:從派生類中創建base-ctor中的重寫對象
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."; } }
}
}
呼喚 「新的BaseClass()PrintSettings();」。顯然會在Console中輸出「BaseClassSetting」。
讓我們獲得了從一個的BaseClass類:
public class InheritedClass : BaseClass
{
public new class Settings : BaseClass.Settings
{
public string InheritedClassSetting { get { return "InheritedClassSetting!"; } }
}
}
呼喚 「新InheritedClass()PrintSettings();」。仍將在控制檯中打印「BaseClassSetting」。
使代碼中使用了「新」版InheritedClass.Settings的唯一途徑是通過增加一個構造函數像
public InheritedClass()
{
this.settings = new Settings();
}
有了這個額外的構造函數,它打印所需的「InheritedClassSetting,BaseClassSetting」來安慰。
現在的問題是:是否有可能使BaseClass-ctor始終使用實例對象的Settings-Class? (沒有在派生類中添加ctor)
不錯,但確實不太可讀;-)你將如何解決這個任務? – Sascha
@Sascha取決於你將如何使用你的課程。例如,如果繼承不是必需的,那麼我只是使用一個接口來爲你所謂的'BaseClassSettings'和'InheritedSettings'(但不能讓一個從另一個派生)。另外,如果不是絕對必要的,我會避免將它們聲明爲嵌套類。 – Mir