簡體   English   中英

多態性1超類4子類

[英]Polymorphism 1 Superclass 4 Subclass

假設我有5個類,1個超類和4個子類。 我的超類是Animal ,具有SpeciesCharateristic ,這2個將繼承給我的子類。

4個子類是: LionEagleBeeWhale (這4個子類擴展了Animal )。 這些子類將具有Voice()Walk()

問題是,我的導師告訴學生:

情況1.如果該程序正在運行,它將啟動,然后會有一個菜單顯示4個子類/ Animal對象。

情況2.用戶選擇了動物后,例如: Eagle 然后顯示鷹的聲音和動作。

情況3.如果用戶選擇退出,則終止程序。

在這種情況下,我們將使用switch + case ,對嗎? 但是,我的問題是如何從超類中調用這4個子類?

如果在每個子類中添加public static void main ,則這4個子類將成為main方法,並且無法使用switch case設置或創建它。 還是我必須創建另一個類來擴展這4個子類並調用它?

謝謝,我希望你明白我的意思:)

您應該通過虛擬方法調用(在鍵入超類的引用上)訪問子類方法。 您也可以使用Factory設計模式。 可以是這樣的:

int choice;
// read the choice, if exit chosen then exit

// getAnimal returns the actual animal instance
// (either a new instance or an existing one from internal registry)
// can select by switch() inside
Animal *animal = getAnimal(choice); // or Animal::getAnimal(choice), etc.

if (animal == null) {
    System.err.println("Invalid choice");
} else {
    // will call the methods on the actual specific animal retrieved by getAnimal()
    animal.Voice();
    animal.Walk();
}

Animal和動物種類都不應該具有main()-只有處理整個邏輯的實際應用程序(也可以是Animal類,但是最好為應用程序本身創建一個單獨的類)。

編輯:這就是getAnimal()方法的樣子:

Animal * getAnimal(int choice)
{
    switch (choice)
    {
    case 1:
        return new Lion();
    case 2:
        return new Eagle();
    // etc.
    default:
        // invalid choice
        return null;
    }
}

在某些時候,您必須創建動物實例

Animal a1 = new Lion();
Animal a2 = new Eagle();
System.out.println(a1.Species());
System.out.println(a2.Species());

創建一個單獨的類來控制您的程序,其中包含main

public class MyClass {
  public static void main(String[] args) {
    int opt = 1; // TODO - use args
    switch (opt) {
      case 1: 
        Lion obj = new Lion();
        System.out.println("Voice: " + obj.Voice() + ", Walk: " + obj.Walk();
        break;
      case 2:
        Eagle obj = new Eagle();
        System.out.println("Voice: " + obj.Voice() + ", Walk: " + obj.Walk();
        break;
 // etc
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM