【问题标题】:Beginning Java Polymorphism Subclass Superclass开始Java多态子类超类
【发布时间】:2013-07-14 22:18:26
【问题描述】:

我正在尝试练习多态性和使用类。我写了一个名为Card 的超类。然后我写了 3 个子类:IDCardCallingCardDriverLicense。然后我编写了另一个名为 Billfold 的类,它应该包含两张卡的插槽。
我应该编写一个BillfoldTester 程序,它将不同子类的两个对象添加到Billfold 对象中。

BillfoldTester 中,DriverLicense 对象和CallingCard 对象被实例化并添加到Billfold,后者通过Card 引用来引用这些对象。

我真的不明白如何做到这一点。我创建了两个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;
    }
}

【问题讨论】:

  • 理论上,当 B 类扩展 A 类时,这意味着 B 是某种更特殊的 A,B 可以表现得像 A。IDCard 是特殊的 Card,可以做Card 的一切都可以。但是你能说一下钱包吗?

标签: java class object subclass superclass


【解决方案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();
    }
}

【讨论】:

  • 感谢您向我展示和解释这个概念。这真的很有帮助,谢谢!!!
【解决方案2】:

这是错误的。钱包不是卡片;它有卡片。

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

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

更喜欢组合而不是继承。

【讨论】:

    【解决方案3】:

    你应该让Billfold 类有两个Card 对象,而不是两个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;
                }
        }
    
    }
    

    【讨论】:

      【解决方案4】:

      好的,你基本上是在正确的轨道上,只有几件事:

      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添加一个方法来打印里面的卡片。

      编辑:哦,是的,duffymo 是完全正确的,你不需要Billfold 上的extends Card

      【讨论】:

      • 我不需要 Billfold 扩展 Card,因为我的 IDCard 子类有一个格式方法,Billfold 可以使用它来打印卡片吗?对不起,我很困惑....这不起作用 public String formatCards() { return card1.format(); }
      • @LindsayBaird 您需要在 Card 类上使用 String formatCards 方法 - 然后您可以在子类中覆盖它。看看传单的答案,了解如何去做。这样,当你有一个 Card 对象时,你就知道它有一个 formatCards 方法 - 否则你必须知道你持有一个 IDCard
      • 我的超类和子类中有格式方法...我必须将对象放入 ArrayList 中才能打印它们吗?我试图在我的 Billfold 中调用它,就像我在 IDCard 课程中所做的那样,但它不允许我这样做......
      • 您需要在BillFold 中有一个方法,例如public void Print(){x.formatCards(); j.formatCards();}。应该这样做,没有BillFold 扩展Card
      猜你喜欢
      • 1970-01-01
      • 2014-02-25
      • 2017-01-09
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多