2012-09-20 82 views
0

我知道這聽起來有點奇怪,但我會嘗試解釋它:假設我有一個有很多屬性的類,並且它們都是隻讀的,所以這個類是唯一可以修改其屬性的類(它正在監聽一個事件,並用該事件中包含的信息填充屬性)。我可以在一個只能由一個具體類訪問的「set」結構中創建一個屬性嗎?

但是,我想封裝一些結構的一些屬性,以創建一個組織良好的層次結構,所以這些結構的屬性也應該是隻讀的,除了所有者類。例如:

public class A 
{ 
    private int a1; 
    public int A1 
    { 
     get{ return a1; } 
    } 

    private B structB; 
    public B StructB 
    { 
     get{ return structB; } 
    } 

    private method eventListenerMethod(...) 
    { 
     a1 = someValue; 
     structB.B1 = otherValue; //I want that only this class can modify this property! 
    } 
} 

public struct B 
{ 
    private int b1; 
    public int B1 
    { 
     get{ return b1; } // This property should be modifiable for Class A!! 
    } 
} 

我想我不能那樣做,但有人知道我該如何實現它嗎? 非常感謝您提前。

+2

讓你的結構的副本,改變問題的性質。不要變異。可變的結構是邪惡的。 http://stackoverflow.com/questions/441309/why-are-mutable-structs-evil – spender

回答

1

似乎你在追求的是C++中的「朋友」關鍵字。但是,它不存在於C#中,但「內部」是一個很好的折衷。所以,只需創建一個「內部集合」屬性,這個屬性只能在組件中訪問(僅)。那麼,誰將會使用你的程序集其他人將無法獲得它

+0

C#中的'internal'完全等價於VB.NET中的'Friend' – greg84

+0

是的,我一直在尋找「friend」關鍵字,這是我需要的,但我喜歡這個解決方案:我的問題是,使用我的DLL的其他程序不應該修改屬性,並且此解決方案可以實現此目的。謝謝!! – DarthRoman

+0

'public int B1 { \t internal set {b1 = value; } \t get {return b1; } //這個屬性應該可以修改爲A類! }' 嘗試類似這樣的代碼 - DLL以外的代碼將會看到屬性,但只有getter .. –

0

更改structclass並使其private,而是把它定義裏面class A

這將意味着只有class A纔有權訪問其屬性。 class B中的所有屬性都可以公開(因爲只有定義它的類才能訪問它)。

這將導致編譯器錯誤,因爲class B將是私有的,但暴露在公共屬性上。爲了解決這個問題,建立一個公開接口,以IClassB(壞名字,但你明白了)的類型公開,並將屬性類型更改爲接口。確保此接口僅獲取屬性方法簽名的訪問器。

像這樣的東西應該工作:

public class A : IClassB 
{ 
    public IClassB B { get; } 

    private class B : IClassB 
    { 
     public int B1 { get; } 
    } 
} 

public interface IClassB 
{ 
    int B1 { get; } 
} 
相關問題