3

GetとSetの両方を持つように設定された抽象プロパティを持つ抽象クラスがあります。派生クラスからこのプロパティを常に取得できるようにしたいことはわかっていますが、特定のタイプの派生クラスでこのプロパティを設定しても意味がない場合があります。

派生クラスでSetアクセサーを省略することはできません(以下のコード例を参照)。派生クラスのsetアクセサーをオーバーライドして、ユーザーから渡された値に対して何もしないようにすることができます。しかし、特定の派生クラスのプロパティを実際に読み取り専用にする別の方法はありますか?最終的には、これらのプロパティをプロパティグリッドに表示しますが、何もしないフィールドにユーザーが値を入力することは望ましくありません。たぶん、特定の派生クラスでプロパティを読み取り専用と見なすだけですか?

また、ICustomTypeDescriptorのオーバーライドなど、プロパティをプロパティグリッドに正しく表示するために、タイプ記述子をいじりたくないのです。

public abstract class MyClass
{
    public abstract string MyProperty
    {
        get;
        set;
    }
}

public abstract class MyDerivedClass
{
    public override string MyProperty
    {
        //VS complains that the Set accessor is missing
        get;
    }
}
4

3 に答える 3

3

これを行うべきではありません。抽象クラスでゲッターとセッターを定義することで、「私から継承したい場合はこれを実装する必要があります」と言っています。次に、「派生クラスにこのルールを無視させるにはどうすればよいか」と尋ねています。

答えは、すべての派生クラスにゲッターが必要な場合は、それを抽象クラスに入れ、派生クラスにセッターを実装するかどうかを抽象クラスから除外して決定させることです。

または、最初の抽象クラスから派生する 2 つのクラスを作成することもできます。1 つはセッターを実装し、もう 1 つは実装せず、派生クラスに意味のあるものを一般化させますが、それはやり過ぎだと思います。

于 2009-06-08T22:38:26.867 に答える
0

使用しabstractないでoverrideください:

public abstract class MyClass
{
    public abstract string MyProperty
    {
        get;
        set;
    }
}

public abstract class MyDerivedClass
{
    public abstract string MyProperty
    {
        get;
    }
}

しかし、@JP が書いたように、これを行うべきではありません。

于 2009-06-08T22:42:14.800 に答える
0

[ReadOnly(true)] 属性を検索しているように見え ます。これは、プロパティ グリッドに読み取り専用として表示されます。
ただし、クラスでは通常のプロパティとして使用できます(読み取りと書き込みの可能性があります)

于 2009-06-08T23:41:44.867 に答える