2010-07-26 43 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類型的變量。現在

,我可以有一個無論是從FooBar,繼承從而Number需求是現在的方式,即直接暴露的xVal屬性的對象。這是因爲我需要讓以下代碼:

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

這裏的問題顯然是Foo,分配自x從子類nNumberVirtual member call in constructor)將還沒有被初始化時。


你認爲什麼是更好的方法來構建這樣的設計?

因爲我呼籲從構造,從而導致Object Reference not set to an Instance of an Object異常,因爲在NumberBarx不會被初始化尚未虛擬成員,我不能用這個當前的代碼。

+0

這是不好的做法,呼籲從超級非最終方法類構造函數。 – Zaki 2010-07-26 12:34:15

+0

是的,這就是我尋求替代設計的原因 – 2010-07-26 12:36:05

回答

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(...) 
    } 
}