0

悪い見出しで申し訳ありませんが、私の英語はそれほど上手ではありません。
次のコードを想定します(テストにはプログラムモードで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."; } }
    }
}

「newBaseClass()。PrintSettings();」の呼び出し 明らかにコンソールに「BaseClassSetting」を出力します。
BaseClassからクラスを派生させましょう:

public class InheritedClass : BaseClass
{
    public new class Settings : BaseClass.Settings
    {
        public string InheritedClassSetting { get { return "InheritedClassSetting!"; } }
    }
}

「newAttachedClass()。PrintSettings();」の呼び出し コンソールに「BaseClassSetting」が引き続き出力されます。
コードに「新しい」継承されたClass.Settingsを使用させる唯一の方法は、次のようなctorを追加することです。

public InheritedClass()
{
    this.settings = new Settings();
}

この追加のctorを使用して、目的の「AliExpressClassSetting、BaseClassSetting」をコンソールに出力します。
ここで質問:BaseClass-ctorが常にインスタンスのオブジェクトのSettings-Classを使用するようにすることは可能ですか?(派生クラスにctorを追加せずに)

4

2 に答える 2

1

いいえ、「仮想型」を持つことはできないためです。

ここで行っていることを達成するために試みることができるいくつかの方法がありますが、それらのすべては、ある時点でInheritedClass独自のバージョンを明示的に参照する必要があります。Settings

于 2013-01-10T16:41:00.463 に答える
1

悪い習慣がある場合は、問題の悪い回避策を期待してください。私は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。すでにかなり混乱しているので追加しましたが、悪化させたくありませんでした。

于 2013-01-10T16:39:14.840 に答える