簡體   English   中英

OOP基礎:從派生類在base-ctor中創建重寫對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM