【发布时间】:2018-08-23 20:22:42
【问题描述】:
代码快速示例
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 类型。
【问题讨论】:
-
这行不通,因为如果这样做,您将能够执行以下操作:
BaseClass obj = new InheritedClass(); obj.Settings = new BaseSettings();。这一定行不通,因为即使 InheritedClass 需要一个 SpecificSettings,您也可以只分配一个 BaseSettings 从而违反类合同。但是,您可以执行以下操作:在 InheritedClass 中定义一个计算机属性,该属性通过编写public SpecificSettings SpecificSettings { get => (SpecificSettings)Settings; set => Settings = value; }进行所有转换 -
this post 也可能是一个很好的复制对象
-
设置和类实现的接口怎么样?这样您就不必重写该属性,只需将其设置为
public ISettings Settings { get; set; }
标签: c# inheritance