0

次のコードを検討してください。

// ======== Abstract class ========

public abstract class Creatures {

     public abstract void loseEnergy();

     public void execute()
     {
          loseEnergy();
     }

}

// ======== Animals ========

public class Animals : Creatures 
{
     public override void loseEnergy(){}
}

public class Birds : Animals 
{
     public override void loseEnergy(){}
}

// ======== Human ========

public class Human : Creatures 
{
     public override void loseEnergy(){}
}

public class Male : Human 
{
     public override void loseEnergy(){}
}

public class Female : Human 
{
     public override void loseEnergy(){}
}

[ このコードは、ここで提案された Jayson のコードに基づいています: 「派生クラス メソッドを呼び出す基本クラス メソッド ?」]

与えられたコード例では、ランタイムに各派生クラス オブジェクトの特定のメソッド (この場合は「loseEnergy()」) を実行させたいのですが、解決策が見つかりませんでした。

どうすればこの問題にアプローチできますか? この問題を解決するために、知っておくことや試してみると役立つことは何ですか?

あなたの助けは大歓迎です!ありがとうございました!

よろしく、セガラ

PS私がこれまでに行ったいくつかの検索:

編集:

「loseEnergy()」メソッドを持つクラスのオブジェクトを含むリストを作成するという以前の考えに固執することにしました。このようなリストがあれば、すべてのオブジェクトのメソッド「loseEnergy()」を呼び出すことができます。これは私が望んでいたことです。

質問はクローズできます。

ありがとうございました。

4

3 に答える 3

0

私はあなたの問題を本当に理解していませんでしたが、とにかく、抽象クラスを使用する手段をいくつか提供しようとすることができます:

  • 抽象メソッドを使用する場合は、サブクラスでオーバーライドする必要があります (インターフェイスで宣言されたメソッドのように)。

  • 継承されたすべてのクラスで同じメソッドを使用する場合は、抽象クラスで実装できます。オーバーライドしない場合、すべてのサブクラスは実装したメソッドを使用します。サブクラスで宣言する必要はありません (extends < ABS_CLASS > で十分です)。

  • サブクラスでオーバーライドされる抽象クラスのメソッドを使用する場合は、キーワードsuperを使用できます。

お役に立てば幸いです。

于 2013-03-26T08:16:51.043 に答える
0

female.loseEnergy() -> human.loseEnergy() ->creative.loseEnergy() の呼び出しが必要な場合は、オーバーライドされたメソッドの最初の行で基本メソッドを呼び出します。

public class Female : Human 
{
    public override void loseEnergy()
    {
        base.loseEnergy();
        // do stuff
    }
}
于 2013-03-26T08:32:17.553 に答える
0

上記の投稿で言及した Greenfoot 環境では、act()メソッドは「世界」に追加されたアクターでのみ呼び出されます。内部的に、これはそれらをリストに追加します。シミュレーション プロセスは、リストを反復処理し、act()各オブジェクトを順番に呼び出します。「世界に」存在しないオブジェクトはシステムに認識されないため、act メソッドが呼び出されません。ここで起こっている魔法はありません。

同様の動作が必要で、オブジェクトを手動でリストに追加しない場合は、基本クラスのコンストラクターで新しいオブジェクトをグローバル リストに追加することができます。私は C# を知らないので、これを行う方法が正確にはわかりませんが、難しいとは想像できません。

于 2013-08-06T13:26:29.607 に答える