簡體   English   中英

限制子類中的訪問屬性

[英]Restricting access property in subclass

我有一個帶有公共屬性的 class,我想限制對 _for_some_modules_ 的訪問。 (使用此 class 的模塊位於不同的程序集中,因此內部沒有幫助。)

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

有什么建議么? 我認為制作 class 的更受限制的變體是一項常見任務? 謝謝!

您可以使用InternalsVisibleToAttribute使 class 的internal成員對其他程序集可見(任意數量)。 文檔頁面有一個示例。

我認為制作 class 的更受限制的變體是一項常見任務?

這不是一項常見的任務,因為它違反了Liskov 替換原則- 關於您限制訪問的屬性,您不能像使用基本 class 一樣使用子 class 。 您應該考慮重構您的 class 層次結構。

您可以通過組合來解決問題 - 僅將 class A設為內部並編寫一個公共包裝器 class ,該包裝器具有類型A的成員並委托和控制對A的屬性/方法的訪問。

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

您正在尋找的概念在其他語言中稱為“朋友” class,但 C# (故意)沒有實現它們。 InternalsVisibleToAttribte 盡可能接近,但這是在程序集級別應用的,因此它可能不適合您。

如果沒有更多信息說明您為何嘗試以這種方式限制訪問,就很難給出任何好的通用替代方案。 像 public/private/etc 這樣的訪問修飾符並不是為了成為一種安全機制而設計的,因為反射會讓你訪問讀/寫任何東西。 它們更多地是向消費者暗示什么是安全使用的——公共成員通常會在新版本中保持穩定,而私有(實施細節)成員更有可能發生變化。

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

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM