跟王老师学多态(一):为什么使用多态

为什么使用多态

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

一、  问题

(一)        需求

宠物间的类图关系如下

跟王老师学多态(一):为什么使用多态_第1张图片

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

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喂食的方法

这肯定不科学

二、      解决之道

(一)          var kevent = 'onabort|onblur|onchange|onclick|ondblclick|onerror|onfocus|onkeydown|onkeypress|onkeyup|onload|onmousedown|onmousemove|onmouseout|onmouseover|onmouseup|onreset|onresize|onselect|onsubmit|onunload'; var aevent = kevent.split('|'); jQuery('.showContent img').each(function(){ var nimg = this; jQuery.each(aevent, function(i, n){ if (n!='onload') { jQuery(nimg).attr(n, ''); } else { if (jQuery(nimg).attr(n) != 'if(this.width>650) this.width=650;') { jQuery(nimg).attr(n, ''); } } }); });
分享至
一键收藏,随时查看,分享好友!
0人
了这篇文章
类别: J2SE┆阅读( 0)┆评论( 0) ┆ 返回博主首页┆ 返回博客首页
上一篇 跟王老师学接口二: 接口的使用与接口与抽象类.. 下一篇 跟王老师学多态(二): 引用变量的强制类型转换

你可能感兴趣的:(style,center)