namespace DnD
{
class Player : Creature
{
Race race;
Spell[] cantrips = new Spell[16];
public Player(Race inputRace)
{
race = inputRace;
}
void castSpell(Spell spell)
{
}
}
class Creature
{
String name;
public int hp;
Creature(string inputName)
{
name = inputName;
}
}
}
出于某種原因,這段代碼給了我一個錯誤,即基類(生物)有一個帶有多個零引數的建構式,確切的錯誤訊息是:
'Creature' does not contain a constructor that takes 0 arguments'
我在另一篇文章中看到過類似的內容,盡管基類的建構式有 1 個引數,而派生類的引數為零,但在這種情況下它們都有 1。
此外,這段代碼來自我的專案,我正在嘗試在 c# 中制作 dnd。
uj5u.com熱心網友回復:
您只需要使用 . 呼叫基類建構式:base (someString)。您沒有在Race此處顯示該類,但如果它具有string RaceName屬性,則可以將其傳遞給基類建構式。
public Player(Race inputRace)
: base (inputRace.RaceName)
{
race = inputRace;
}
另外,考慮Creature類是否應該有一個具體的實體。這可能是抽象類的一個很好的候選者。
uj5u.com熱心網友回復:
您錯過了這樣一個事實,即如果您在建構式定義之后不撰寫:base(...),C#會:base()為您撰寫(公平地說,這并不明顯)
每個建構式都必須呼叫基礎建構式,一直到下降樹到物件。如果您不提供關于呼叫哪個建構式的說明 C# 會為您呼叫一個(不可見的)。如果沒有這樣的建構式,C# 就無法自動對其進行排序;你必須提供方向
如果你不提供建構式,C# 會提供一個什么都不做的空建構式,這樣它就可以建立一個鏈。如果您確實提供了一個,它不會提供一個(但它可能仍會修改您的呼叫 base)
所以,如果你寫:
class NoConstructor{
}
C# 將其修改為:
class NoConstructor{
NoConstructor():base(){}
}
如果你寫:
class ConstructorNoBase{
ConstructorNoBase(){}
}
C# 將其修改為:
class ConstructorNoBase{
ConstructorNoBase():base(){}
}
如果你寫:
class ConstructorWithBase{
ConstructorWithBase():base{}
}
C# 不理會它
您可以達到以下情況:
class Parent{
Parent(int arg){
}
}
class Child:Parent{
}
class Child2:Parent{
Child2(int arg){
}
}
而 C# 將它們修改為:
class Parent{
Parent(int arg):base(){ //no problem; object has a no-arg constructor
}
}
class Child:Parent{
Child():base(){ //problem, there isn't a no-arg base constructor
}
}
class Child2:Parent{
Child2(int arg):base(){ //problem, there isn't a no-arg base constructor
}
}
特別是在第二種情況下,C# 不會查看 Child2 并說“哦,int arg父級上有一個建構式,而int arg在子級上有一個建構式,我會呼叫base(arg)” - 它只是把base()放入
要阻止它創建這種“對不存在的東西的呼叫”,您必須:
- 提供它正在呼叫的東西,所以它確實存在
- 提供您自己的呼叫以
base(...)停止 c# 插入自己的呼叫
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/465788.html
上一篇:使用日歷過濾資料網格
