質問

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

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." );
        }
    }
役に立ちましたか?

解決

できません。あなたが来ることができる最も近いのは:

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

個人的には、すべてのメンバーが欲しくない場合、本当にこれから由来するべきかどうかを尋ねたくなります...代わりに構成を使用できますか?

他のヒント

たとえそれが可能であっても、あなたは本当にアクセサを「非表示」したくありません(あなたが指摘したように、彼らは基本クラスからアクセスすることができます)。 「この方法は非推奨であり、避けるべきである」という警告/エラーの後です。そのため、あなたは 時代遅れの属性, 、「The Attribute Obsoleteは、使用されなくなってはならないタイプとタイプのメンバーをマークするために使用される」と文書化されています。

編集:アクセサに例外を投げることを強くお勧めします。これは、一般的に「リスコフ代替原則」と呼ばれるものに違反します。これは、基本クラスが望まれる場所で派生クラスを使用できることです。本当に、それはあなたが派生したインスタンスを渡すかもしれない既存のコードが、 .Items 接触時に爆発するのではなく、賢明な方法で機能するゲッター。例外をスローすると、到達が非常に難しい場所でエラーをデバッグするのが難しくなる可能性があります(スーパークラスがブラックボックスであることを考えると)。

子どものクラスで不動産を公開し、アクセスした場合は例外を投げることができます。その場合、子クラス内の基本クラスのプロパティのみにアクセスすることを確認する必要があります。

public new ComboBoxItemCollection Items
{
    get { throw new InvalidOperationException(); }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top