2017-06-14 17 views
4

私はプログラムのために自分自身を教えようとしており、私は実践のためにRPGの戦いをしています。 (基本的にはC#の非常にシンプルな古い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

あなたを:

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

あなたも、「あなたのコンストラクタにあなたのようなベース・コンストラクタに転送する必要はありませんdragon'クラスをいくつか追加のパラメータを追加することができますコンストラクタが継承されていないため '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 string DragonStuff { get; private set } 

    public Dragon(string _name, int _health, int _attack, int _level, string _dragonStuff) : base (_name, _health, _attack, _level) 
    { 
     DragonStuff = _dragonStuff; 
    } 
} 
関連する問題