c# - 通过继承改变返回签名——多态

标签 c# .net polymorphism

只是想知道是否有任何方法可以执行以下操作:

public Interface IDataField 
{
    object GetValue();
}

public Interface IComplexDataField : IDataField
{
    object GetDefaultValue();
}

public class MyBase
{
    private IDataField _DataField;

    public MyBase()
    {
        this._DataField = this.CreateDataField();
    }

    public virtual IDataField CreateDataField()
    {
        return new DataField(); //Implements IDataField 
    }

    **public virtual IDataField GetDataField()**
    {
        return this._DataField;
    }

    public void SomeMethod()
    {
        this.GetDataField().GetValue();
    }
}


public class MyComplexBase : MyBase
{
    public override IDataField CreateDataField()
    {
        return new ComplexDataField(); //Implements IComplexDataField which Implements IDataField 
    }

    **public override IComplexDataField GetDataField()**
    {
        return (IComplexDataField)base.GetDataField();
    }

    public void SomeComplexSpecificMethod()
    {
        this.GetDataField().GetValue();
        this.GetDataField().GetDefaultValue();
    }
}

干杯 安东尼

最佳答案

您想要的是返回类型的协方差。这在 C# 中不存在。

你能否使 MyBase 通用:

public class MyBase<T> where T : IDataField
{
    public virtual T CreateDataField()
    {
        ... etc ...
    }
}

或者,您可以使用“new”重新声明该方法并隐藏基类方法。两者都不是特别吸引人......

关于c# - 通过继承改变返回签名——多态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/266901/

相关文章:

c - 为什么 oop 语言比 c 语言提供更好的多态性?

java - Java 中多个类的 Varargs 问题

c# - 如何创建带有标签而不是整数的数组

.net - F# 版本的 Haskell 列表解构

c# Linq to entities 选择大小写到字符串

c# - 模型更改后如何更新 View ?

c# - IList.Cast<typeof(T)>() 返回错误,语法看起来没问题

OOP 设计 - 许多对象每个都与其他对象的有限子集具有独特的交互

c# - 如何输入字符串并从对象中获取同名属性?

c# - 使用 RhinoMocks 模拟引用参数