2017-06-14 150 views
4

所以我試圖教自己編程,我正在做一個實踐的RPG戰鬥的東西。 (基本上只是一個非常簡單的舊的RPG戰鬥系統)但是,我對繼承有點困惑。所以我有一個基類的敵人:繼承和基礎構造函數

class Enemy 
{ 
    public string name; 
    public int health; 
    public int attack; 
    public int level; 

    public Enemy(string _name, int _health, int _attack, int _level) 
    { 
     name = _name; 
     health = _health; 
     attack = _attack; 
     level = _level; 
    } 
} 

然後,我有這個類Dragon

class Dragon : Enemy 
{ 

} 

爲什麼說

沒有給定參數對應於需要正式的 'Enemy.Enemy(string,int,int,int)的參數'_name'?

我的想法是,它會使用敵人的構造函數,我必須讓每個派生類自己的構造函數?

+0

是你必須在派生自'Enemy'的類中創建一個構造函數,因爲構造函數不是繼承的,這些構造函數將不得不調用你的'Enemy'構造函數。 – juharr

+0

如果'Enemy'具有無參數的構造函數,那麼在構造子類時會自動調用它,但它沒有。如果(且只有)'Enemy'沒有定義任何構造函數,編譯器會自動爲它提供一個無參數的構造函數。這是有道理的:你可以免費釋放整個構造器的東西,但如果你涉足它,編譯器會給你完全的控制權。 –

回答

7

您的問題的基本答案是。您的派生類必須定義構造函數,特別是當基類中沒有默認構造函數時,他們必須這樣做。

這是因爲基類構造函數總是在派生類被創建時被觸發(實際上,它們被觸發第一個)。如果您沒有構造函數來將基類構造函數的必需參數傳遞給編譯器,編譯器不知道如何處理它。

在你的情況,像

public Dragon(string _name, int _health, int _attack, int _level) 
    :base(_name, _health, _attack, _level) 
{ 
} 

讓你開始。當然您可能需要(也可能有)其他參數Dragon。您也可以將文字傳遞到基礎構造函數中(因此您無需使用所有基類參數對Dragon進行參數化)。

public Dragon(string _name) 
    :base(_name, 1000, 500, 10) 
{ 
} 

唯一的要求是使用現有的基類構造函數。

+1

只是爲了展開這個偉大的答案:子類構造函數不需要與基類具有相同的參數,它可以有更多或更少,甚至根本沒有。只要'base'語句提供了基類所期望的參數,它就會很開心。 –

+0

OOOO好吧,清除了我很多,謝謝!爲了確保,基本上''base'在說什麼是使用基本信息正確? – Yummy275

+0

@ Yummy275不;它說「使用匹配後面參數的基類構造函數」 – BradleyDotNET

3

由於基類有一個構造函數,它始終點火創建派生類時,那麼應該參數的構造函數添加到基類:在派生類中

class Enemy 
{ 
    public string name; 
    public int health; 
    public int attack; 
    public int level; 

    public Enemy(string _name, int _health, int _attack, int _level) 
    { 
     name = _name; 
     health = _health; 
     attack = _attack; 
     level = _level; 
    } 

    protected Enemy() 
    { 

    } 
} 

或實現構造像這樣:

public Dragon(string _name, int _health, int _attack, int _level) 
: base(_name, _health, _attack, _level) 
{ 
} 
2

是的,你必須在Dragon中聲明一個構造函數。你可以聲明一個無參數的構造函數來調用基構造器:

public Dragon() : base("test", 1, 1, 1){} 

或者實現一個自己的參數化構造函數。

1

我不知道我是否完全理解你的問題。 你想創建一個類龍的實例並使用敵人級的構造函數嗎?

在這種情況下,您需要爲Dragon-Class添加一個自己的構造函數,然後添加'base'關鍵字以將您的參數從Dragon-Constructor轉發到基類的構造函數。就像這樣:

class Dragon : Enemy 
{ 
    public Dragon(string _name, int _health, int _attack, int _level) : base (_name, _health, _attack, _level) 
    { 

    } 
} 

您可以將某些額外的參數,甚至添加到你「dragon'-類的構造函數,你不必轉發到原構造,如:

class Dragon : Enemy 
{ 
    public string DragonStuff { get; private set } 

    public Dragon(string _name, int _health, int _attack, int _level, string _dragonStuff) : base (_name, _health, _attack, _level) 
    { 
     DragonStuff = _dragonStuff; 
    } 
}