4

私が派生した基本クラス(ブラックボックス。変更できません)があります。私の派生クラスでは、ユーザーがプロパティを使用できるようにするのではなく、代わりにパブリック関数を使用できるようになりました。理由の詳細については説明しませんが(関係ありません)、非表示にしようとしているプロパティは次のとおりです。

public ComboBoxItemCollection Items { get; }

私はこれを試しましたが、うまくいきませんでした:

private new ComboBoxItemCollection Items { get; set; }

私もこれを試しましたが、コンパイラは両方のアクセサをプライベートにすることは許可されていないと言っています。

public new ComboBoxItemCollection Items { private get; private set; }

これを適切に行うにはどうすればよいですか?私はこれが完全なセキュリティソリューションであることに依存していないことに注意してください。明らかに、基本クラスにキャストすることで、このプロパティを呼び出すことができます。これは単に、コンパイル時エラーをユーザーに提供することを目的としています。これは、ユーザーがこのプロパティを使用できず、代わりに派生クラスで新しい関数を使用する必要があることを理解するのに役立ちます。

編集

このスレッドの回答のおかげで、私は次の解決策を思いつきました。

    [Obsolete( "This property is obsolete. Please use MRUIdComboBox.AddItem() instead.", true )]
    public new ComboBoxItemCollection Items
    {
        get
        {
            throw new NotSupportedException( "This property is not supported. Please use MRUIdComboBox.AddItem() instead." );
        }
    }
4

3 に答える 3

3

できません。あなたが来ることができる最も近いものは次のようになります:

[Obsolete(IsError=true)]
public new ComboBoxItemCollection Items
{
    get { return base.Items; } // Or throw an exception
}

個人的には、メンバー全員が欲しくないのなら、本当にこれから派生するべきなのかと尋ねたくなるのですが…代わりに作曲を使用できますか?

于 2011-06-16T16:13:11.823 に答える
2

可能であったとしても、アクセサーを「非表示」にする必要はありません(お気づきのとおり、アクセサーは基本クラスからアクセスできます)。「このメソッドは非推奨であり、避ける必要があります」という警告/エラーが発生しました。そのため、 「廃止された属性は、使用されなくなったタイプとタイプのメンバーをマークするために使用されます」として文書化されている、廃止された属性を確認することをお勧めします。これはまさにユースケースです。

編集:アクセサーで例外をスローしないことを強くお勧めします。これは、一般に「リスコフの置換原則」と呼ばれるものに違反します。つまり、基本クラスが必要な場所であればどこでも派生クラスを使用できます。実際、これは、派生インスタンスを渡す可能性のある既存のコードが、.Items接触時に爆発するのではなく、賢明な方法で機能するゲッターを期待しているという事実に関する単なる派手な言葉です。例外をスローすると、到達が非常に難しい場所でエラーをデバッグするのが難しくなる可能性があります(スーパークラスがブラックボックスである場合)。

于 2011-06-16T16:13:45.753 に答える
1

プロパティを子クラスでパブリックにし、アクセスされた場合に例外をスローすることができます。次に、子クラス内の基本クラスプロパティにのみアクセスすることを確認する必要があります。

public new ComboBoxItemCollection Items
{
    get { throw new InvalidOperationException(); }
}
于 2011-06-16T16:13:44.020 に答える