【问题标题】:Derived settings in constructor are 'null'. Base class overload constructor not passing settings?构造函数中的派生设置为“null”。基类重载构造函数不传递设置?
【发布时间】:2012-05-31 12:43:22
【问题描述】:

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

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

这个方法的问题是三级运算符只对基类起作用,并没有将新的实例传递给派生类的构造函数。 (“设置”保持为空)

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

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

【问题讨论】:

    标签: c# base derived


    【解决方案1】:

    这很难看,但您可以更改 base 调用以将您传递的值 返回 分配给 settings

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

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

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

    【讨论】:

    • 当我提到将设置存储在基类中时(原始问题的最后一行),我正在考虑基类方法中暴露的 Settings 属性。问题是需要将设置转换为每个派生类的正确派生设置。那不是一样丑陋吗?
    • @user1423893:它会有点丑陋,但我认为它会比副作用分配更清楚。
    猜你喜欢
    • 2014-01-21
    • 2018-07-21
    • 2016-07-19
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 2022-12-03
    相关资源
    最近更新 更多