1

独自の派生設定を使用して派生クラスを作成しました。

public abstract class BaseClass
{
    public BaseClass(Game1 game, BaseClassSettings settings) 
    {
        if (settings == null)
        {
            Console.WriteLine("BASE PANIC!");
        }
    }

    public abstract BaseClassSettings Write();
}

public abstract class BaseClassSettings
{
    public abstract BaseClass Load(Game1 game, BaseClassSettings settings);
}

クラスをインスタンス化するとき、コンストラクターをオーバーロードして基本クラスを呼び出し、正しい派生設定の新しいインスタンスを作成します。

public class DerivedFoo : BaseClass
{
    public DerivedFoo(Game1 game, DerivedFooSettings settings) 
    :base(game, settings == null ? new DerivedFooSettings() : settings) 
    {
        if (settings == null)
        {
            Console.WriteLine("DERIVED PANIC!");
        }
    }

    public override BaseClassSettings Write()
    {
        DerivedFooSettings settings = new DerivedFooSettings();

        return settings;
    }
}

public class DerivedFooSettings : BaseClassSettings
{
    public override BaseClass Load(Game1 game, BaseClassSettings settings)
    {
        return new DerivedFoo(game, settings as DerivedFooSettings);
    }
}

このメソッドの問題は、3次演算子が基本クラスに対してのみ機能し、派生クラスのコンストラクターに新しいインスタンスを渡さないことです。(「設定」はnullのままです)

派生クラスのコンストラクターメソッドで3次演算子を複製せずに、設定を自動的に渡すにはどうすればよいですか?

設定が正しいタイプではないため、基本クラスに設定を保存できません。

4

1 に答える 1

1

醜いですが、呼び出しを変更して、渡すbase値を割り当てることができますsettings

public DerivedFoo(Game1 game, DerivedFooSettings settings) 
: base(game, settings = (settings == null ? new DerivedFooSettings() : settings))

これは、コンストラクターに渡されるものを変更するのではなく、コンストラクターのパラメーターDerivedFooの値を変更するだけであることに注意してください。settings

もちろんBaseClass、プロパティ(おそらく保護されている)を公開し、コンストラクター中にそれを設定すると、コンストラクター本体内でプロパティ値をSettings使用できます。それはもっときれいだろう、IMO-私はこれまでこのようなコンストラクタチェーン呼び出し内で代入式を使用したことはないと思う...DerivedFoo

于 2012-05-31T12:47:31.407 に答える