1

基本的なオブジェクト指向の概念を学ぶために、C# を使用して簡単なゲームをコーディングしています。

以下のこのコードでは:

class entity
    {
    int hp;
    string name;

    public entity()
    {
        hp = 1;
        name = "entity";
    }

    public string status()
    {
        string result;
        result=name + "#" + " HP:" + hp;
        return result;
    }






    class dragon : entity
    {

    new public string name;
    new int hp;


    public dragon()
    {
        hp = 100;
        name = "Dragon";

    }
}

そんな「ドラゴン」のオブジェを作りました

dragon mydragon = new dragon();

問題は次のコードにあります。

mydragon.status();

これは文字列を返しますが、エンティティクラス オブジェクトの「名前」と「hp」を含みます (つまり、hp=1、name=entity)。

これでドラゴン オブジェクトの値 (hp=100、name=dragon) を返すようにしたいと思います。何が間違っているのかわかりませんが、とても単純なようです。

いじり、何時間も苦労した後、私がたどり着いた唯一の解決策は、 status()メソッドを単純にコピーしてドラゴン クラスに貼り付けることでした。しかし、これを行うためのより良い方法があると確信しています。

よろしくお願いします。

4

3 に答える 3

6

フィールドhpnameクラスentityprotectedアクセス修飾子で装飾するだけです。これにより、dragonクラスでも使用できるようになり、再定義する必要がなくなります。のコンストラクターは、クラスdragonのコンストラクターの後に実行され、そのフィールドの値をオーバーライドするため、そのままにしておくことができます。entity

次のようになります。

public class Entity
{
    protected int hp;
    protected string name;

    public Entity()
    {
        hp = 1;
        name = "entity";
    }

    public override string ToString()
    {
        string result = name + "#" + " HP:" + hp;
        return result;
    }
}

public class Dragon : Entity
{
    public Dragon()
    {
        hp = 100;
        name = "Dragon";
    }
}

C# のクラス名は大文字で始めるのが慣習です。また、クラスの文字列表現を返すなどの場合、ToString()メソッドは通常オーバーライドされます。

于 2012-07-28T14:35:10.497 に答える
0

クラス内のvirtualキーワードをメソッドに追加し、継承された各クラスに追加します。entitystatusoverride

.ToString()編集:代わりに使用したい場合、ニコラのコードも非常に公平に見えますStatus()

于 2012-07-28T14:42:45.560 に答える
0

次の変更を行います...

class entity
    {
    protected int hp;
    protected string name;
...


class dragon : entity
    {

    // new public string name;  - you're creating new variables hiding the base ones
    // new int hp;              - ditto. Don't need them
....
于 2012-07-28T14:43:00.453 に答える