2010-03-28 52 views
1

我甚至不知道這個原則被稱爲什麼或如何搜索它,所以我真誠道歉,如果它曾經提出過,但最好的辦法是舉一個例子。在C#中,我可以隱藏/修改子類中的訪問器嗎?

class Properties 
{ 
    public string Name { get; set; } 
} 

class MyClass 
{ 
    class SubProperties: Properties 
    { 
     public override Name 
     { 
      get { return GetActualName(); } 
      set { SetActualName(value); } 
     } 
    } 

    public SubProperties ClassProperties; 

    private string GetActualName() 
    { 
     return SomeFunction(); 
    } 

    private void SetActualName(string s) 
    { 
     ClassProperties.Name = SomeOtherFunction(s); 
    } 
} 

的想法是有實例MyClass有一個完全無障礙的財產ClassProperties任何對象。對於這個對象,它看起來完全像一個Properties對象,但在幕後,MyClass實際上是在計算和修改字段的結果。這種聲明方法顯然是錯誤的,因爲我無法從SubProperties定義中訪問GetActualName()SetActualName()。我將如何實現這樣的事情?

回答

2

你在尋找類似的東西嗎?

abstract class Properties 
{ 
    public abstract string Name { get; set; } 
} 

class MyClass 
{ 
    private class SubProperties : Properties 
    { 
     private MyClass myClass; 

     public SubProperties(MyClass myClass) 
     { 
      this.myClass = myClass; 
     } 

     public override Name 
     { 
      get { return this.myClass.GetActualName(); } 
      set { this.myClass.SetActualName(value); } 
     } 
    } 

    private string name; 

    public MyClass 
    { 
     this.MyClassProperties = new SubProperties(this); 
    } 

    public Properties MyClassProperties { get; private set; } 

    private string GetActualName() 
    { 
     return this.name; 
    } 

    private void SetActualName(string s) 
    { 
     this.name = s; 
    } 
} 

您需要將引用傳遞給MyClass的實例的子屬性例如,如果你想從子屬性訪問MyClass的方法。

+0

這看起來像我以後,我會給它一個鏡頭。唯一真正的區別是,在我的情況下,在MyClass中沒有私有變量「name」 - 它實際上是讀/寫套接字,但我想將其完全從調用對象中隱藏起來。 謝謝! – Diego 2010-03-28 20:25:38

+0

完美。那就是訣竅。 – Diego 2010-03-28 20:39:42

0
public virtual string Name { get; set; } 
相關問題