2011-05-03 73 views
1

我有一個具有公共屬性的類,我想限制對_for_some_modules_的訪問。 (使用這個類的模塊駐留在不同的程序集中,所以內部沒有幫助。)限制子類中的訪問屬性

我的第一個想法是子類化,並使得派生屬性訪問器是私有的或保護的,但這是不可能的。派生屬性必須具有相同的訪問權限。 (見http://msdn.microsoft.com/en-us/library/75e8y5dd.aspx

有什麼建議嗎?我認爲制定一個更受限制的班級變體是一項常見任務? 謝謝!

+0

我不認爲這是可能的 - 一旦你越過邊界裝配,全盤皆輸。 – Tejs 2011-05-03 19:41:25

+0

我可以看到你的班級的骨骼版本嗎?通常,這樣的事情可以通過更有意的設計來解決。 – 2011-05-03 19:54:24

回答

1

我認爲制定 更受限制的類變體是一項常見任務嗎?

這不是一個普通的任務,因爲它違反了Liskov substitution principle - 你不能使用子類以同樣的方式,你會使用基類的問候你限制訪問屬性。你應該考慮重構你的類層次結構。

您可以通過組合來解決問題 - 僅使內部類A成爲公共包裝類,並寫入類型爲A的成員,並委派和控制對A的屬性/方法的訪問。

1

制定更多受限制的子類實際上並不常見,因爲它會破壞假定他們可以訪問公共成員的基類的消費者。一般來說,你的課程應該從限制開始,在專業化的時候減少,反之亦然。

您正在尋找的概念在其他語言中稱爲「朋友」類,但C#(故意)不會實現它們。 InternalsVisibleToAttribte儘可能地接近它,但是它在組件級應用,所以它可能不適合你。

沒有關於您爲什麼試圖以這種方式限制訪問的更多信息,很難給出任何好的通用替代方案。像public/private /等訪問修飾符並不是設計成安全機制,因爲Reflection會讓您訪問讀/寫所有內容。它們更多地暗示消費者可以安全使用 - 公共成員通常在新版本中保持穩定,而私有(實現 - 細節)成員更有可能改變。

+0

感謝您的洞察力(下面還介紹了BrokenGlass),關於不讓子類更具限制性。 – user736570 2011-05-04 06:39:44

+0

我想實現的是創建一個Model類的子集。 Model類是基類,派生類是子集(或模型的視圖)。目的是不同的消費者只會看到該模型的相關部分。我想避免複製粘貼來獲取子集類的相關屬性。 (我想避免Reflection,因爲對於其他開發人員可能很難理解......) – user736570 2011-05-04 06:47:45

0

你總是可以做這樣的事情:

class MyBaseClass 
{ 
    protected string MyRestrictedProperty { get; set; } 
} 

class MyClass : MyBaseClass 
{ 
    public string MyPublicProperty 
    { 
     get { return MyRestrictedProperty; } 
     set { MyRestrictedProperty = value; } 
    } 
}