[英]Polymorphism 1 Superclass 4 Subclass
假設我有5個類,1個超類和4個子類。 我的超類是Animal
,具有Species
和Charateristic
,這2個將繼承給我的子類。
4個子類是: Lion
, Eagle
, Bee
和Whale
(這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.