2009-05-20 65 views
1

可以說我繼承了一個類,它有幾個公共屬性和/或方法,但是我不希望它們成爲我的類的公共屬性/方法 - 換句話說,我想使這些屬性保護了我班的屬性。限制對繼承屬性的訪問C#

這可以實現嗎?

我希望我已經夠清楚了,如果不是請讓我知道,我會更好地解釋自己。

編輯:

吧,謝謝所有的答案,但是我不認爲我是很清晰。我試圖完成的是:

我寫了一個擴展ListView控件的Windows控件。 ListView有一個公共集合項,即可以修改。這很好,但是我寫了新的方法來添加項目到ListView,因爲我需要額外的數據。

到目前爲止,這一切都很好,但是Items集合仍然可以被任何東西修改,這是一個問題,因爲如果通過Items集合的直接操作添加一個項目,並不是我需要的所有數據都會被收集,錯誤。

因爲我們希望在不同的項目中多次重複使用這個控件,所以我們擔心遲早會使用向Items集合添加項目的默認方式(僅僅是時間問題)。我們正在尋找一種方法來防止這種情況的發生,比如當Items collection變大時拋出一個異常,但這是它的打算方式。

我希望現在這一切都有意義。

回答

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 2009-05-20 15:46:56

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用戶控件)是,你必須重新實現了這麼多東西,在你的用戶控件讓它表現得像一個ListView。 因此,在這裏使用構圖是非常不直接的。 – mmmmmmmm 2009-05-20 15:49:52

0

我不使用AOP(也許是PostSharp)來放置您不想使用的屬性,然後您可以以某種適合您的方面的方式處理它。