以动物园中饲养员给动物喂食为业务背景,让同学们体会“抽象类、类的继承、接口、接口实现类、方法重写和多态”等面向对象思想的综合应用。
動物園には飼育員のほか、犬と猫の 2 匹の動物がいます。
飼育員は、犬には骨、猫には魚など、さまざまな動物にさまざまな食べ物を与えます。動物は食事をするときに音を立てます。犬は吠え、猫はニャーと鳴きます。
このプログラムは、飼育員が動物に餌を与える過程をシミュレートするもので、主な機能は次のとおりです:
(1) 飼育員は「動物園へようこそ! 私は飼育員の×××です。」と言います。
(2) ブリーダーが犬に骨を与えると、犬はそれを食べるときに「ワン~~」と音を立てます。
(3)飼育者が猫に魚を与えると、猫が餌を食べると「ニャ~~」と鳴きます。
【事件の目的】
• 「動物に餌を与える飼育者」のプログラム設計の実施アイデアを分析する方法を学びます。
• アイデアに基づいて「ブリーダーが動物に餌を与える」プログラム設計のソース コードの作成、コンパイル、および操作を独自に完了します。
• インターフェースを柔軟に使用して多重継承の問題を解決する方法を学びます。
【事件分析】
事件の対象となるのは飼育者、各種動物、各種食品など。
このようにして、 Feeder、Animal、Food の 3 つのクラスを簡単に抽象化できます。
動物園では犬と猫に餌を与えているため、Cat クラスと Dog クラスは Animal クラスから派生しています。
同様に、Food クラスはそのサブクラス、Bone クラスと Fish クラスを派生できます。魚は単なる
食べ物ではなく、実は動物でもあります。ただし、Java は多重継承をサポートしていないため、Fish は Food と
動物の 2 つの親クラス。解決策は、Food と Animal のいずれかをインターフェースに変更することです。Cat クラスを考慮すると、
DogクラスはAnimalの属性やメソッドを多く継承する必要があり、Foodにも変数はありますが、Animalに比べると数は少ないです。
ほとんどなかったので、最終的に Food をインターフェースとして定義し、Fish and Bone にインターフェースを実装させることを検討しました。
【プログラム構造】
【実行コード】
1.
package cn.edu.gpnu.bank.Feeder;
public abstract class Animal {
public String name;
public Animal(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public abstract void eat(Food food);
}
package cn.edu.gpnu.bank.Feeder;
class Bone implements Food {
private String name;
public Bone(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName(){
return name;
}
}
package cn.edu.gpnu.bank.Feeder;
public class Cat extends Animal{
public Cat(String name) {
super(name);
}
public void eat(Food food) {
System.out.println("喵喵喵~~"+getName()+"正在吃鲜美的"+food.getName());
}
}
package cn.edu.gpnu.bank.Feeder;
public class Dog extends Animal {
public Dog(String name) {
super(name);
}
public void eat(Food food){
System.out.println("汪汪汪~~"+getName()+"正在啃香喷喷的"+food.getName());
}
}
package cn.edu.gpnu.bank.Feeder;
public class Feeder {
public String name;
public Feeder(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void speak(){
System.out.println("欢迎来到动物园!"+"我是饲养员"+getName());
}
public void feed(Animal animal,Food food){
animal.eat(food);
}
}
package cn.edu.gpnu.bank.Feeder;
class Fish extends Animal implements Food {
public Fish(String name) {
super(name);
}
@Override
public String getName() {
super.getName();
return name;
}
@Override
public void eat(Food food) {
}
}
package cn.edu.gpnu.bank.Feeder;
public interface Food {
public String getName();
}
package cn.edu.gpnu.bank.Feeder;
public class Zoo {
public static void main(String[] args){
Feeder feeder = new Feeder("小华");
feeder.speak();
Dog dog = new Dog("泰迪犬");
Cat cat = new Cat("波斯猫");
Bone bone =new Bone("猪骨头");
Fish fish =new Fish("黄花鱼");
feeder.feed(dog,bone);
feeder.feed(cat,fish);
}
}
【運用結果】