代码快速示例
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类型。
答案 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
。
您可以使用BaseClass
和InheritedClass
来实现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。