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);
    }
}

这种方法的问题是三级运算符只适用于基类,不会将新实例传递给派生类的构造函数。(“设置”保持为空)

如何自动传递设置而不必在派生类的构造函数方法中复制三级运算符?

我无法将设置存储在基类中,因为它们的类型不正确。

4

1 回答 1

1

这很难看,但是您可以更改base调用以分配要传递的值settings

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

请注意,这不会改变传递构造函数的DerivedFoo内容——它只是改变构造函数中settings参数值。

当然,如果BaseClass暴露了一个Settings属性——可能是受保护的——并在构造函数期间设置它,你可以只在构造函数体中使用属性值。DerivedFoo这会更干净,IMO - 我认为我从来没有在这样的构造函数链调用中使用过赋值表达式......

于 2012-05-31T12:47:31.407 回答