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メソッド (メソッドなど) を用意し、それを使用してパブリック メソッドを再宣言することです。つまり、ベースで:CreateDataFieldnew

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 に答える