2010-11-18 131 views
7

我有以下問題:問題的構造和繼承在C#

public class A { 
    public A(X, Y, Z) { 
    ... 
    } 
} 

public class B : A { 
    public B(X, Y) : base(X, Y) { 
     //i want to instantiate Z here and only then pass it to the base class! 
    } 
} 

我怎樣才能解決這個問題?有沒有辦法?

+0

什麼?是'B:A'?如果是這樣,A怎麼能比B多*數據?另外,A似乎沒有這樣的構造函數... – Kobi 2010-11-18 10:18:14

+0

你的意思是公共類B:{在你的例子中? – 2010-11-18 10:18:17

+0

已編輯原創帖子。是的,它的B:A – 2010-11-18 10:19:26

回答

13

常見的解決辦法是調用一個靜態方法屬於類型它可以計算要傳遞給基礎構造函數的參數的值。

例如:

public B(int x, int y) 
    : base(x, y, CalculateZ(x, y)) 
{ 

} 

// You can make this parameterless if it does not depend on X and Y 
private static int CalculateZ(int x, int y) 
{ 
    //Calculate it here. 

    int exampleZ = x + y; 

    return exampleZ; 
} 

請注意,CalculateZ不能是一個實例方法,因爲this引用不是在構造函數初始化可用。

從語言規範10.11.1構造函數初始化:

實例構造函數初始化 不能訪問實例是創建 。因此,這是在 構造函數初始化的參數表達引用該 一個 編譯時錯誤,因爲它是一個 編譯時錯誤爲一個參數 表達通過簡單名稱來引用任何實例 構件。

編輯:在說明中將'實例'更改爲'靜態'。

+1

+1,但是,你是否認爲調用*靜態*方法? – LukeH 2010-11-18 10:24:22

+0

@Kobi,@LukeH:是一個腦凍結的錯字;頭腦認爲一件事,手指另一種。感謝您指出。 – Ani 2010-11-18 10:25:24

1
public abstract class A { 
    public A(X, Y) { 
    ... 
    } 

    public abstract Z TheVariableZ{get;set;} 
} 

public class B : A { 
    public B(X, Y) : base(X, Y) { 
     //i can only calculate Z here! 
    } 

    public override Z TheVariableZ{//implement it here} 
} 

如果你不能讓一個抽象的,只是標記屬性作爲虛擬

+3

在構造函數中調用虛擬方法是一個壞主意:http://msdn.microsoft.com/en-us/library/ms182331(v=VS.100).aspx – 2010-11-18 10:27:13

1

可能這:

public abstract class A { 
    public A(X, Y) { 
     CalculateZ(); 
    } 

    abstract void CalculateZ(); 
} 

public class B : A { 
    public B(X, Y) : base(X, Y) { 

    } 

    override void CalculateZ() 
    { 
     ... Calculate here. 
    } 
} 
+3

調用虛擬方法在構造函數中是一個不好的主意:http://msdn.microsoft.com/en-us/library/ms182331(v=VS.100).aspx – 2010-11-18 10:26:38

2

您需要在調用構造函數之前計算Z.如果它很簡單,你可以使用內聯表達式,否則你需要定義一個輔助函數。

使用helperfunction:

public class A { 
    public A(X x, Y y, Z z) { 
    ... 
    } 
} 

public class B : A { 
    private static Z calculateZ() 
    { 
    } 

    public B(X x, Y y) : base(X, Y, calculateZ()) { 

    } 
} 

沒有helperfunction:

public B(X, Y) : base(X, Y, X+Y) { 

}