为什么使用多态

主讲人:王少华       QQ群号:483773664

一、  问题

(一)        需求

宠物间的类图关系如下

图2.3.BMP

       现要求实现主人给宠物喂食功能,具体需求如下:

1.      Dog喂食,其健康值增加3,输出吃饱信息

2.      Penguin喂食,其健康值增加5,输出吃饱信息

(二)       分析

1.      给抽象类Pet增加抽象方法eat()

2.      Dog:重写eat

3.      Penguin: 重写eat

4.      创建主人类Master

1.      添加给狗喂食的方法:feed(Dog dog)

2.      添加给企鹅喂食的方法:feed(Pegnuin peguin)

5.      编写测试方法

1.      调用主人类给狗喂的方法

2.      调用主人类给企鹅喂的方法

(三)        示例代码

1.       Pet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public abstract class Pet {
    private String name = "无名氏";// 昵称
    private int health = 100;// 健康值
    private int love = 0;// 亲密度
     
    /**
     * 抽象方法eat(),负责宠物吃饭功能。
     */
    public abstract void eat();
     
    /**
     * 有参构造方法。
     * @param name  昵称
     */
    public Pet(){
         
    }
     
    public Pet(String name) {
        this.name = name;
    }
     
    public void setName(String name) {
        this.name = name;
    }
 
    public void setHealth(int health) {
        this.health = health;
    }
 
    public void setLove(int love) {
        this.love = love;
    }
 
    public String getName() {
        return name;
    }
    public int getHealth() {
        return health;
    }
    public int getLove() {
        return love;
    }
    /**
     * 输出宠物信息。
     */
    public void print() {
        System.out.println("宠物的自白:\n我的名字叫" + this.name +
                ",健康值是"    + this.health + ",和主人的亲密度是"
                + this.love + "。");
    }   
}

2.       Dog

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class Dog extends Pet {
    private String strain;// 品种
    /**
     * 有参构造方法。
     * @param name   昵称
     * @param strain   品种
     */
    public Dog(String name, String strain) {
        super(name);
        this.strain = strain;
    }
    public String getStrain() {
        return strain;
    }
    /**
     * 重写父类的print方法。
     */
    public void print(){
        super.print(); //调用父类的print方法
        System.out.println("我是一只 " + this.strain + "。");
    }
     
    /**
     * 实现吃食方法。
     */
    public void eat() {
        if(getHealth()>=100){
            System.out.println("狗狗"+this.getName() +"吃饱了,不需要喂食了!");
        }else{
            this.setHealth(this.getHealth()+3);
            System.out.println("狗狗"+this.getName() + "吃饱啦!健康值增加3。");
        }
    }
}

3.       Penguin

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class Penguin extends Pet {
    private String sex;// 性别
    /**
     * 有参构造方法。
     * @param name 昵称
     * @param sex 性别
     */
    public Penguin(String name, String sex) {
        super(name);
        this.sex = sex;
    }
    public String getSex() {
        return sex;
    }
    /**
     * 重写父类的print方法。
     */
    public void print() {
        super.print();
        System.out.println("性别是 " + this.sex + "。");
    }
     
    /**
     * 实现吃食方法。
     */
    public void eat() {
        if(getHealth()>=100){
            System.out.println("企鹅"+this.getName() +"吃饱了,不需要喂食了!");
        }else{
            this.setHealth(this.getHealth()+5);
            System.out.println("企鹅"+this.getName() + "吃饱啦!健康值增加3。");
        }
    }
}

4.       Master

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class Master {
    private String name = "";// 主人名字
    private int money = 0; // 元宝数
    /**
     * 有参构造方法。
     * @param name 主人名字
     * @param money 元宝数
     */
    public Master(String name, int money) {
        this.name = name;
        this.money = money;
    }
     
    public void setName(String name) {
        this.name = name;
    }
 
    public void setMoney(int money) {
        this.money = money;
    }
 
    public int getMoney() {
        return money;
    }
    public String getName() {
        return name;
    }
    /**
     * 主人给Dog喂食。
     */
    public void feed(Dog dog) {
        dog.eat();
    }
    /**
     * 主人给Penguin喂食。
     */
    public void feed(Penguin pgn) {
        pgn.eat();
    }
}

5.       Test

1
2
3
4
5
6
7
8
9
10
11
12
public class Test {
    public static void main(String[] args) {
        Dog dog = new Dog("欧欧", "雪娜瑞");
        dog.setHealth(80); //设置健康值,以便正常喂食
        Penguin pgn = new Penguin("楠楠", "Q妹");
        Master master=new Master("王先生",100);
        master.feed(dog);//主人给狗狗喂食
        master.feed(pgn);//主人给企鹅喂食
        pgn.setHealth(80); //设置健康值,以便正常喂食
        master.feed(pgn);//主人再次给企鹅喂食
    }
}

 (四)          问题

如果再领养XXX宠物,就需要给XXX看病,怎么办?

1)        添加XXX类,继承Pet类,实现吃食方法

2)        修改Master类,添加给XXX喂食的方法

这肯定不科学

二、      解决之道

(一)          ©著作权归作者所有:来自51CTO博客作者imentors的原创作品,如需转载,请注明出处,否则将追究法律责任

0

收藏

imentors

105篇文章,8W+人气,0粉丝

Ctrl+Enter 发布

发布

取消