1

OOPプログラミングの概念が欠けていると思いますが、正確にはわかりません。

異なるクラスから作成されたオブジェクトをどのように使用できますか?

たとえば、カードを使用する必要があるとします。Cardクラスがあり、すべての共有プロパティが含まれています。通常のカードとジョーカーカードはカードクラスから継承され(ジョーカーは任意のカードの色を引き継ぐことができます)、カードは価値がないかポイントの価値があるため、NormalCardから継承されたScoreCardがあります。

UML:

では、プログラミング中にこのモデルをどのように使用できますか?配列でN枚のカードを作成しますが、カードを生成するときに、実際のカードがジョーカー/スコア/通常のカードであるかどうかを判断する必要がありますか?そして後で、カードがジョーカー/ノーマル/スコアカードであるかどうかをどのようにテストできますか?なぜなら、ScoreCardaprivate int score; とsetters / gettersがある場合、NormalCardはこのプロパティを持たないため、ifステートメントを作成するときに、何をテストすればよいかわからないからです。

   Card[] cardsArray = new Card[52];

   for (int i = 0; i<cardsArray.length;i++) {
       //Some source tells if a card is a Score/Normal/Joker
       String src;
       switch (src) {
           case "Joker":Card[i] = new JokerCard();
               break;
           case "Normal":Card[i] = new NormalCard();

               .... etc
       }
   }

   //Some Userevent:
   ..userevent(Card in) {
        //Test what
        if (in.value == 4) {
            this.user.setScore(this.user.getScore()+in.score);
        }

    }
4

5 に答える 5

5

ポリモーフィズムについて学ぶべきだと思います。継承と組み合わせると強くなります:)

問題は、そのカードがジョーカー/通常のカードなどであるかどうかを実際に知る必要がないということです。代わりに、ユーザーイベントを処理する必要があるinterface/abstractクラスのレベルでメソッドを提供します。すべての「実際の」クラスは、このメソッドをオーバーライドして実装を提供する必要があります。これを表示します:

interface Card {
    void handleUserEvent(UserEvent event);

}

public class NormalCard implements Card {
    public void handleUserEvent(UserEvent event) {
          // do something here
    }

}

public class Joker implements Card {
    public void handleUserEvent(UserEvent event) {
         // hey I'm a joker
    }

}

お役に立てれば

于 2013-03-24T11:20:55.467 に答える
2

int getScore()たとえば、ScoreCardインスタンスを除いて、すべてのカードに常に0を返すメソッドを含めることができます。

すべてのカードはboolean canTake(Card otherCard)、JokerCardに対して常にtrueを返し、他のカードについては他のいくつかのルールに従う可能性があります。

明確な答えを出すのは難しいですが、polymorphsmを使用する場合は、すべての派生クラスを実装する必要がある基本クラスのメソッドが必要です。

于 2013-03-24T11:19:43.403 に答える
0

各サブクラスにtoString()メソッドを配置する限り、forループで.toString()メソッドを使用してカードのタイプを判別できます。

Card[] cardsArray = new Card[52];

   for (int i = 0; i<cardsArray.length;i++) {
       //Some source tells if a card is a Score/Normal/Joker
       String src = Card[i].toString; // This should define the type of current card
       switch (src) {
           case "Joker":Card[i] = new JokerCard();
               break;
           case "Normal":Card[i] = new NormalCard();

               .... etc  
       }
   }


public int getScore(Card c){
    // Returns the score. In the getScore() method you should already tell if the 
    //  card is an Ace or a Joker because you can give it a number of 0 for an Ace or whatever you want.
    int Score = c.getScore();

}
于 2013-03-24T11:27:29.130 に答える
0

MDAアプローチを採用している場合は、モデルを使用してコードを生成できます。それを効果的に行うツールはたくさんあります。

インターフェイスを操作すると、このインターフェイスが表すオブジェクトの実際のタイプがわかりません。まれに、instanceofステートメントを使用する場合があります。

純粋なインターフェースを作成するには、その中に変数を入れないでください。代わりprivateに、実装クラス内でミューテーターを持つメンバーを使用してください。インターフェイスを介してこれらのプロパティにアクセスする場合は、これらのミューテイタをpublicメソッドとしてインターフェイスに配置します。

于 2013-03-24T11:33:36.790 に答える
-1

instanceofを使用する

if(someCard instanceof JokerCard) {
  /* Some logic here*/
}
else if(someCard instanceOf ScoreCard) {
  int score = ((ScoreCard) someCard).getScore();
  /* some more logic here */
}
于 2013-03-24T11:20:43.733 に答える