1

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

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();
    }
}

干杯安东尼

4

3 回答 3

4

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

你能不能MyBase通用:

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

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

于 2008-11-05T22:07:55.847 回答
1

在 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();
}
于 2008-11-05T22:09:00.790 回答
0

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

您最好的方法在这里解释:协变返回类型

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>
{
   ...
}
于 2008-11-05T22:17:51.893 回答