首页 > 解决方案 > 如何用继承的类覆盖属性?

问题描述

代码的快速示例

public class BaseSettings {}
public class SpecificSettings : BaseSettings {}
public class BaseClass
{
    public virtual BaseSettings Settings {get; set;}
    public void DoSomething(BaseSettings settings)
    {
        Settings = settings;
    }
}
public class InheritedClass : BaseClass
{
    public override SpecificSettings Settings {get; set;}
}

我有许多继承 BaseClass 的类,它们都将具有相同的“DoSomething”方法。但是,我希望派生类 SpecificSettings 成为调用时设置的类。

如果我使用此代码,它将生成一个错误,告诉我

'InheritedClass.Settings':类型必须是 'BaseSettings' 以匹配被覆盖的成员 'BaseSettings.Settings'

我不是 OOP 专家,但我认为继承类BaseSettings 的一种。

我已经研究过用泛型来做这件事,但它似乎不符合我的要求,因为在某些时候我需要(在反序列化期间)让方法的返回类型为 BaseClass 类型。

标签: c#inheritance

解决方案


BaseClass您的班级中有一个虚拟方法

public virtual BaseSettings Settings { get; set; }

如果您要InheritedClass继承BaseClass并想要override Settings方法,Settings 则方法签名需要与基类相同。

public class InheritedClass : BaseClass
{
    public override BaseSettings Settings { get; set; }
}

但是您override没有任何意义,因为设置与您的基类做同样的事情。


我会ISetting<T>用合同泛型而不是继承来创建接口BaseClass

您可以使用BaseClassInheritedClass实现ISetting<T>并决定哪个类使用哪个设置。

如果SpecificSettings扩展了数字属性BaseSettings

我会创建CommonProperty类来承载属性,因为继承使类强耦合。使用组合比继承更灵活。

public class CommonProperty {
    // move your BaseClass common with SpecificSettings in here.
}

public interface ISetting<T>
    where T : BaseSettings
{

    T Settings { get; set; }
    void DoSomething(T settings);
}

public class BaseSettings { }
public class SpecificSettings : BaseSettings { }

public class BaseClass : ISetting<BaseSettings>
{
    public CommonProperty commonProperty { get; set; }

    public virtual BaseSettings Settings { get; set; }
    public void DoSomething(BaseSettings settings)
    {

        Settings = settings;
    }
}
public class InheritedClass : ISetting<SpecificSettings>
{
    public CommonProperty commonProperty { get; set; }
    public SpecificSettings Settings { get; set; }

    public void DoSomething(SpecificSettings settings)
    {
        Settings = settings;
    }
}

推荐阅读