2017-09-03 326 views
-1

在C#中編寫類似於實際工作的東西(編譯並運行,但無法正常工作)是否可能?在C#中初始化子類中的父類數組成員

public abstract class Foo 
{ 
    public int[] a; 
} 

public class Bar : Foo 
{ 
    public int[] a = new int[123]; 
} 

或者我必須使用它(工作正常,但看起來不如上面的代碼)?

public abstract class Foo 
{ 
    public int[] a; 

    public void Init(int size) 
    { 
     a = new int[size]; 
    } 
} 

public class Bar : Foo 
{ 
    public Bar() 
    { 
     Init(123); 
    } 
} 
+2

定義「正常工作」:您想實現什麼目標?第一個是在基礎類中隱藏「a」,這會變得非常混亂。使用構造函數通常優於重新聲明,但正如所說的,取決於意圖。 – dlatikay

+0

你應該這樣做public int [] a = new int [123];無論是在基本的抽象類中,還是希望子類實現它,您都應該將其標記爲abastract以及public abstract int [] a; – Isma

+0

在Bar中只寫_a = new int [123]; _沒有重新聲明由抽象類繼承的 – Steve

回答

2

Bar.a獸皮繼承的基部件(Foo.a)。爲了使這個工作正常,首先,你需要改變你的基地成員從一個字段到另一個其次聲明它爲abstract然後override它在你的派生類。事情是這樣的:

public abstract class Foo 
{ 
    public abstract int[] a { get; set; } 
} 

public class Bar : Foo 
{ 
    public override int[] a { get; set; } 
} 

或者,如果你只是想有子類設置數組大小使用constructor在派生類中是這樣的:基於您的評論上述

public abstract class Foo 
{ 
    public int[] a; 
} 

public class Bar : Foo 
{ 
    public Bar() 
    { 
     a = new int[123]; 
    } 
} 
2

意圖是讓子類設置數組大小。

這聽起來像你在找什麼叫做構造函數。您將使用它來定義創建對象實例所需的值,並使用這些值構建對象。

你的基類需要的價值,這樣的事情:

public abstract class Foo 
{ 
    public int[] a; 

    public Foo(int size) 
    { 
     a = new int[size]; 
    } 
} 

所以現在一個需求爲構造函數提供值。子類可以使用構造函數鏈輕鬆地從自己的構造函數中提供值:

public class Bar : Foo 
{ 
    public Bar(int size) : base(size) { } 
} 
+0

不知道構造函數鏈接,似乎是一個很好的解決方案。 – Thorham

+1

它幾乎感覺像字段'a'應該是'readonly'。 –

+0

@Jeppe Stig Nielsen - 在實際的項目中,它不能,因爲它必須是可以改變的。該字段擁有PRNG狀態,並且必須可以根據需要重新種子,並且還必須能夠保存和恢復PRNG的狀態。 – Thorham