2010-07-26 5 views
2

나는 다음과 같은 것을 달성하기 위해 노력하고 있어요 :문제 (생성자에서 가상 멤버 호출)

class Foo 
{ 
    public virtual int Number { get; set; } 

    public Foo(int n) 
    { 
     Number = n; //Virtual member call in constructor 
    } 

    public void Do() { 
     Console.WriteLine(Number); 
    } 

} 

class Bar : Foo 
{ 
    public override int Number 
    { 
     get 
     { 
      return x.Val; 
     } 
     set 
     { 
      x.Val = value; 
     } 
    } 

    Bar(int n) : base(n) 
    { 
     X x = new X(); 
     x.Val = n; 
    } 

    public void F() { 
     x.Something(); //changes x.Val 
    } 
} 
전화했을 때 나는 Do에 대한 호출을 전달해야하기 때문에 나는이 일을하고 그 이유는

유형은 Bar입니다.

이제 나도 즉 직접 xVal 속성을 노출, 현재 상황으로 Foo 또는 Bar에서 이렇게 Number 요구를 상속 객체를 가질 수 있습니다. 아직 초기화되지 않았을 n 서브 클래스에서 x 이후 (Virtual member call in constructor) Number에 할당 할 때

Bar b = new Bar(5); 
b.F(); //changes the value of Val in x 
b.Do(); //Needs to print the correct, modified value 

여기서 문제는, Foo에 분명히 : 나는 다음과 같은 코드를 허용 할 필요가 있기 때문이다.


그런 디자인을 구성하는 더 좋은 방법은 무엇이라고 생각하십니까? 나는 아직 초기화되지 않았을 Bar에서 Number에서 x 이후 Object Reference not set to an Instance of an Object 예외가 발생 생성자에서 가상 멤버를 호출하고 있기 때문에

나는이 현재 코드를 사용할 수 없습니다.

+0

은 슈퍼에서 비 final 메소드를 호출하는 나쁜 관행입니다 클래스 생성자. – Zaki

+0

그래, 그 이유는 내가 대안 디자인을 요구하고있어. –

답변

0

내 좋아하는 인용구 : 나는 작업에서 기본 데이터를 분리 할

상속을 통해

호의 조성물은 :

interface IMyNumber 
{ 
    int Number { get; set; } 

    void Something(); 
} 

class MyNumber : IMyNumber 
{ 
    public int Number { get; set; } 

    public MyNumber(int n) 
    { 
     Number = n; 
    } 

    void Something() {... } 
} 

class MyBoxedNumber : IMyNumber 
{ 
    int Number { get { ... } set {... } } 

    void Something() {... } 
} 

class Bar 
{ 
    private IMyNumber_foo; 

    Bar(IMyNumber foo) 
    { 
     _foo = foo; 
    } 

    public void F() { 
     _foo.Something(); //changes x.Val 
    } 

    public void Do() { 
     Console.WriteLine(...) 
    } 
} 
관련 문제