构造函数中的派生设置为“null”.基类重载构造函数不传递设置

本文关键字:构造函数 设置 重载 基类 派生 null | 更新日期: 2023-09-27 18:35:58

我创建了一个派生类,具有自己的派生设置。

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

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

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

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

构造函数中的派生设置为“null”.基类重载构造函数不传递设置

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

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

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

当然,如果BaseClass公开了一个Settings属性(可能受保护)并在构造函数期间设置了该属性,则可以只在DerivedFoo构造函数主体中使用属性值。那会更干净,IMO - 我想我从来没有在这样的构造函数链调用中使用过赋值表达式......