构造函数中的派生设置为“null”。基类重载构造函数没有传递设置?

时间:2012-05-31 12:43:23

标签: c# base derived

我已经使用自己的派生设置创建了一个派生类。

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

此方法的问题在于,primary运算符仅适用于基类,并且不会将新实例传递给派生类构造函数。 ('设置'保持为空)

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

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

1 个答案:

答案 0 :(得分:1)

这很丑陋,但您可以更改base调用,将您正在传递的值返回settings

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

请注意,这不会改变传递给 DerivedFoo构造函数的内容 - 它只会更改<{1}}参数的值构造函数。

当然,如果settings公开了一个BaseClass属性 - 可能受到保护 - 并在构造函数中设置它,那么你可以在{{1}中使用属性值构造函数体。那会更干净,IMO - 我不认为我曾经在构造函数链调用中使用了一个赋值表达式,就像这样......