-2

数年前にオブジェクト指向プログラミングのクラスで学んだことを思い出して、テキスト ベースの RPG ゲームを作成することにしました。仕事を終わらせたいと思っているかどうかはわかりませんが、あまり気にしません。プログラムの書き方をもう一度学びたいだけです。

関数、データ型、およびクラスが C++ でどのように機能するかの基本を覚えた後、次のコードを書きました。

class Character
{
      string Name;

public:
       Character()
       {
           Name = "Charname";
       }

       string GetName(){return Name;}
       void SetName(string sName){Name=sName;}
};

今、私は自分のキャラクターに人種を持たせたいと思っています。最初のアイデアは、クラス Character のサブクラスを、許可された種族ごとに 1 つずつ作成することでした。これは、オブジェクト指向プログラミングで行うことのように思えます。しかし、私はそれがどのように機能するかを考え始めました。「もしトムが人間で、クララがオークで、トムとクララが結婚しようとしているなら、エラーメッセージを出してください」みたいなことが言えるようになりたいです。私はおそらく、人間とオークが異なることを行うための異なる方法を持っていることも望んでいます.

大まかに言えば、前者では Race を Character のメンバー(属性として理解している) であるかのように扱い、前者ではあたかもそれがサブクラスであるかのように扱いたいと考えています。

人間がキャラクターのサブクラスである場合、前者は可能ですか? つまり、オブジェクトは自分がどのクラスに属しているかを知ることができますか?

そして、私は何をすべきで、なぜですか?

4

1 に答える 1

2

この設計上の問題を「特化」と呼びます。この場合、すべての人種の動作は基本的に同じであるため、Race をサブクラスではなく属性にする必要があります。種族が全種族統一の特殊能力ハンドルを付与する場合。たとえば、一部の種族だけが暗闇で見ることができると想像してください。これを行う方法は次のとおりです。

int getVisionRange( int iCurrentLightLevel ){
    if( iCurrentLightLevel < LightLevel.DIM ){
       if( this.race == ORC || this.race == ELF ){
           return VisionRange.GOOD;
       } else {
           return VisionRange.NONE;
       }
    } else {
       return MAX_VISION_RANGE;
    }
}

またはそれらの線に沿った何か。

于 2013-05-26T22:24:32.180 に答える