0

ポリモーフィズムとクラスを使用して練習しようとしています。というスーパークラスを書きましたCardIDCard次に、CallingCard、 、という 3 つのサブクラスを作成しDriverLicenseました。次にBillfold、2 枚のカード用のスロットを含むはずの という別のクラスを作成しました。オブジェクトに異なるサブクラスの 2 つのオブジェクトを追加
するプログラムを作成することになっています。BillfoldTesterBillfold

ではBillfoldTesterDriverLicenseオブジェクトとCallingCardオブジェクトがインスタンス化され、 に追加されます。Billfoldこれは、これらのオブジェクトをCard参照で参照します。

これを行う方法がよくわかりません。2 つのオブジェクトを作成しましCardたが、それを自分のオブジェクトに追加しようとしていますが、うまくいきませんBillfold。試してみBillfold a = new Card (x);ましたが、正しくありません...どんな助けも大歓迎です。

public class BillfoldTester
{
    public static void main (String[]args)
    {
        Card x= new IDCard("Julie", 1995);
        Card j= new DriverLicense("Jess", 1997);
  //Having trouble trying to put the objects into my Billfold and print it.
    }
}

public class Billfold extends Card
{
    private String card1;
    private String card2;

    void addCard(String Card)//Not sure if this should be String
    {
        card1=Card;
    }
}

public class Card
{

   private String name;

   public Card()
   //This is my superclass
   {
      name = "";
   }

   public Card(String n)
   {
      name = n;
   }

   public String getName()
   {
      return name;
   }

   public boolean isExpired()
   {
      return false;
   }

   public String format()
   {
      return "Card holder: " + name;
   }
}
  public class IDCard extends Card
{
    //This is one of my subclasses
    private int IDNumber;
    public IDCard (String n, int id)

    {
        super(n);
        this.IDNumber=id;
    }
    public String format()
    {
        return super.format() + IDNumber;
    }
}
4

4 に答える 4

1

これは間違っています。札入れはカードではありません。それはカードを持っています。

public class Billfold
{
    List<Card> cards = new ArrayList<Card>();

    void addCard(Card card) {
        if (card != null) {
            this.cards.add(card);
        }
    }
}

継承よりも構成を優先します。

于 2013-07-14T22:29:09.063 に答える
1

ポリモーフィズムの例。機能がまさにあなたが必要としているものかどうかはわかりませんが、アイデア全体を見ることができます (願っています)。Billfold クラスの showAllFormat() メソッドを参照してください。

ポイント全体は、DriverLicense と IDCard の異なる format() メソッド内にあります。「実際の」(または最初に割り当てられた)オブジェクトに応じて、「カード」クラスのみを参照する場合でも、異なるメソッドが呼び出されます。

注: あなたは DriverLicense の実装を提供していません。このサブクラスがまったく異なる可能性があることを示すために、少し異なるコンストラクターがあります。

import java.util.ArrayList;
import java.util.List;


class Billfold {
    List<Card> list = new ArrayList<Card>(10);

    void addCard(Card card) // Q: Not sure if this should be String
                            // A: You would like to add a Card
    {
        list.add(card);
    }

    void showAllFormat() {
        // go polymorphism !...
        // when you call this general 'format()' you see the subclasses
        // 'format()' is executed, not from 'Card' class
        for(Card x: list) {
            System.out.println(x.format());            
        }
    }
}

class Card {
    private String name; /* owner */

    public Card() //This is my superclass
    {
        name = "";
    }

    public Card(String n) {
        name = n;
    }

    public String getName() {
        return name;
    }

    public boolean isExpired() {
        return false;
    }

    public String format() {
        return "Card holder: " + name;
    }
}

class IDCard extends Card {
    //This is one of my subclasses
    private int IDNumber;

    public IDCard(String n, int id) {
        super(n);
        this.IDNumber = id;
    }

    public String format() {
        return "(ID)" + super.format() + " " + IDNumber;
    }
}

class DriverLicense extends Card {
    private String type;

    public DriverLicense(String n, String type) {
        super(n);
        this.type = type;
    }

    public String format() {
        return "(DL)" + super.format() + " TYPE: " + type;
    }
}

public class BillfoldTester {
    public static void main(String[] args) {

        Card x = new IDCard("Julie", 1995);
        Card j = new DriverLicense("Jess", "AB");

        Billfold bf = new Billfold();
        bf.addCard(x);
        bf.addCard(j);

        bf.showAllFormat();
    }
}
于 2013-07-14T23:09:39.933 に答える
0

わかりました、あなたはおおむね正しい軌道に乗っています。いくつかのことだけです:

void addCard(String Card)//Not sure if this should be String
{
    card1=Card;
}

そうです、これは次のようになります。

void addCard(Card card)
{
    card1=card;
}

次に、それらを追加します。

public class BillfoldTester
{
    public static void main (String[]args)
    {
        Card x= new IDCard("Julie", 1995);
        Card j= new DriverLicense("Jess", 1997);
        Billfold bf = new Billfold();
        Billfold.addCard(x);
        Billfold.addCard(j);
    }
}

Billfold次に、カードを印刷するメソッドを追加します。

編集:そうそう、そしてダッフィーモは完全に正しいです、あなたはextends Cardオンにする必要はありませんBillfold

于 2013-07-14T22:29:27.527 に答える
0

Billfoldクラスには2Cardつではなく2つのオブジェクトが必要ですStrings

public class Billfold
{
    Card card1;
    Card card2;

    void addCard(Card card) {
        if (card != null) {
            if (card1 != null) {
                this.card1 = card;
            } else {
                this.card2 = card;
            }
    }

}
于 2013-07-14T22:32:38.287 に答える