27

基本抽象クラスの特定のプロパティに C# ゲッターの実装のみを強制したいと考えています。派生クラスは、必要に応じて、静的にバインドされた型をパブリックに使用するために、そのプロパティのセッターも提供する場合があります。

次の抽象クラスがあるとします。

public abstract class Base
{
    public abstract int Property { get; }
}

セッターも実装する派生クラスが必要な場合は、素朴に試すことができます。

public class Derived : Base
{
    public override int Property
    {
        get { return field; }
        set { field = value; } // Error : Nothing to override.
    } 

    private int field;
}

しかし、存在しないセッターをオーバーライドしようとすると、構文エラーが発生します。ベースセッターをプライベートと宣言するなど、他の方法を試しましたが、それを妨げるあらゆる種類のエラーに出くわしました。基本クラスの契約に違反しないため、それを行う方法が必要です。

ちなみに、それはインターフェースで行うことができますが、私は本当にそのデフォルトの実装が必要です.

私はそのような状況に頻繁に出くわしました。それを行うための隠された C# 構文トリックがあるかどうか疑問に思っていました。

4

5 に答える 5

18

同じタイプで同じ署名を使用するnewことはできないため、直接行うことはできません。2 つのオプションがあります。基本クラスを制御する場合は、 2 番目のプロパティoverrideを追加します。

public abstract class Base
{
    public int Property { get { return PropertyImpl; } }
    protected abstract int PropertyImpl {get;}
}
public class Derived : Base
{
    public new int Property {get;set;}
    protected override int PropertyImpl
    {
        get { return Property; }
    }
}

それ以外の場合は、クラス階層に追加のレベルを導入できます。

public abstract class Base
{
    public abstract int Property { get; }
}
public abstract class SecondBase : Base
{
    public sealed override int Property
    {
        get { return PropertyImpl; }
    }
    protected abstract int PropertyImpl { get; }
}
public class Derived : SecondBase
{
    public new int Property { get; set; }

    protected override int PropertyImpl
    {
        get { return Property; }
    }
}
于 2009-09-28T21:09:07.050 に答える
3

次のようなものはどうですか:

public abstract class Base
{
    public virtual int Property
    {
        get { return this.GetProperty(); }
        set { }
    }

    protected abstract int GetProperty();
}
于 2009-09-28T21:09:24.927 に答える