【问题标题】:Change return signature via inheritance – Polymorphism通过继承改变返回签名——多态性
【发布时间】:2008-11-05 22:03:57
【问题描述】:

只是想知道是否有任何方法可以做到以下几点:

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# .net polymorphism


【解决方案1】:

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

您能否将MyBase 设为通用:

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

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

【讨论】:

    【解决方案2】:

    您在 C# 3.0 中最接近的方法是拥有一个单独的 virtual 方法(就像您的 CreateDataField 方法)来执行实际工作并且可以被覆盖,然后使用 new 重新声明公共方法.即在基地:

    public IDataField GetDataField()
    {
        return GetDataFieldImpl();
    }
    protected virtual IDataField GetDataFieldImpl()
    {
        // return a basic version
    }
    

    在子类中:

    protected override IDataField GetDataFieldImpl()
    {
        // do something more fun
    }
    public new IComplexDataField GetDataField()
    {
        return (IComplexDataField)GetDataFieldImpl();
    }
    

    【讨论】:

      【解决方案3】:

      您尝试做的是称为协变返回类型。它们在当前版本的 C# 中不存在,但有传言说它会在下一个版本中引入。

      您最好的方法在这里解释:covariant return types

      public class MyBase<T> where T : IDataField, new()
      {
          public virtual T CreateDataField()
          {
              return new T();
          }
      
          public virtual T GetDataField()
          {
              return this._DataField;
          }
      
      }
      
      public class MyComplexBase : MyBase<ComplexDataField>
      {
         ...
      }
      

      【讨论】:

        猜你喜欢
        • 2012-11-12
        • 1970-01-01
        • 2013-03-28
        • 1970-01-01
        • 1970-01-01
        • 2013-03-03
        • 1970-01-01
        相关资源
        最近更新 更多