2009-05-20 15 views
1

いくつかのパブリックプロパティやメソッドを持つクラスを継承しますが、それらをクラスのパブリックプロパティやメソッドにすることは望ましくありません。それらのプロパティはクラスのプロパティを保護しました。継承されたプロパティへのアクセスを制限するC#

これを達成できますか?

私は十分にはっきりしていなかったと思いますが、私に知らせてください、自分自身をより良く説明しようとします。

EDIT:

右、しかし私は、私は十分に明確だったとは思わないの回答ありがとうございました。私が達成しようとしているのは次のとおりです。

ListViewコントロールを拡張するWindowsコントロールを作成しました。 ListViewにはパブリックコレクションItemsがあり、これを変更できます。それはすべて問題ありませんが、私は必要な余分なデータのためにリストビューにアイテムを追加する新しいメソッドを書いています。

これまでのところうまくいきましたが、項目コレクションを直接操作して項目を追加すると、必要なすべてのデータが収集されるわけではないので、項目コレクションは何かによって変更される可能性があります。エラー。

異なるプロジェクトでこのコントロールを何度も再利用したいので、遅かれ早かれ、Itemsコレクションにアイテムを追加するデフォルトの方法が使用されることになります(本当に時間がかかります)。 Itemsコレクションのサイズが大きくなったときに例外をスローするなど、意図したとおりに、そのようなことを防ぐ方法を探しています。

これはすべて今、意味があることを願っています。

答えて

4

決して言わないでください。これはおそらく最良のアイデアではありませんが、私にとってはうまくいくようです。これは、サブクラスでそれを再実装し、属性を使用してアイテムを隠すことによってアイテムを非表示にします。私は "CustomExposedItems"プロパティに追加して、既存の項目が引き続き基になるListViewにアクセスできることを確認できます。

public partial class CustomListView : ListView 
{ 
    public CustomListView() 
    { 
     InitializeComponent(); 
    } 

    public System.Windows.Forms.ListView.ListViewItemCollection CustomExposedItems 
    { 
     get 
     { 
      return base.Items; 
     } 

    } 

    [EditorBrowsable(EditorBrowsableState.Never)]  
    [Browsable(false)]  
    [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
    [Obsolete("Use the new custom way of adding items xyz")] 
    public new System.Windows.Forms.ListView.ListViewItemCollection Items  
    { 
     get { throw new NotSupportedException(); }  
    } 

} 
+0

+1;キャストを介して元のアイテムにアクセスすることは可能です。しかし、私はあなたがListViewを含むUserControlを使用せずに得ることが最良だと思う(さらに悪い問題を解決する)。 – mmmmmmmm

1

継承によってこれを行うことはできません。これは実際に継承が何であるかです。 は、関係がであるため、インタフェースを縮小できません。派生クラスは、基本クラスの完全な表現でなければなりません。

継承を参照に変換します。あなたはそれを呼び出すことによって "基本クラス"の実装を再利用します。 (継承ではなく合成)多態性が必要な場合は、共通のインタフェースを追加するか、共通部分を別の抽象基本クラスに移動します。

3

いいえ、できません。あなたができる最善の策は、クラスを作成してそれから派生した基本クラスをラップすることです - しかし、これはもちろん継承を破ります。 (私はあなたが基本クラスを変更することはできません。あなたの新しいクラスは、基本クラスから派生するべきではないように見えるので、あなたは、あなたがデザインを再考すべきであることができる場合を想定しています。)

class BaseClass 
{ 
    public String IWantThis { get; set; } 
    public String IDoNotWantThis { get; set; } 
} 

class MyClass 
{ 
    private BaseClass baseClass = new BaseClass(); 

    public String IWantThis 
    { 
     get { return this.baseClass.IWantThis; } 
     set { this.baseClass.IWantThis = value; } 
    } 
} 
4

継承は、すべてのことができます「と言ってについてですベースクラスを使用するのと同じ方法でこの派生クラスを使用し、特別な動作を提供します。

あなたは、あなたが継承を使用すべきではない、基底クラスと同じように派生クラスを使用できない場合:あなたはLiskov's Substitutability Principleを破壊しています。そのような場合、継承の代わりに合成を使用します。 (個人的には、クラス間の継承をそれほど使用していません。構成をもっと好みます。専門化の側面が問題なく実際に機能するケースはほとんどありません。になります。)

+0

WinFormsのコントロールとコンポジション(この場合はListViewを含むUserControl)の問題は、ListViewのように振る舞うように、UserControlで多くのものを再実装する必要があることです。 ここで構成を使用することは非常に不正です。 – mmmmmmmm

0

私は使用したくないプロパティの周りにAOP、おそらくPostSharpを使用しないで、あなたのアスペクトで適切な方法でそれを扱うことができます。

関連する問題