您如何使用继承的类覆盖属性?

时间:2018-08-23 20:22:42

标签: c# inheritance

代码快速示例

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类型。

2 个答案:

答案 0 :(得分:1)

您的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;
    }
}

答案 1 :(得分:0)

您可以定义一个接口,并将其称为ISetting,其中BaseSetting和SpecificSetting都可以实现该接口。然后,设置的BaseClass和InheritedClass中的Settings类型将是ISetting Settings。