2010-03-28 3 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

이와 비슷한 제품을 찾고 계십니까? 당신이 하위 속성에서 MyClass의 방법에 액세스하려면

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의 인스턴스에 대한 참조를 전달해야합니다.

+0

이것은 내가 겪은 것처럼 보입니다. 유일한 차이점은 내 경우에는 MyClass에 private 변수 "name"이 없다는 것입니다. 실제로 소켓에 읽기/쓰기가 있지만 호출 객체에서 완전히 숨기고 싶습니다. 감사합니다. – Diego

+0

완벽. 그것은 트릭을했다. – Diego

0
public virtual string Name { get; set; } 
관련 문제