JavaRush /Java 博客 /Random-ZH /使用多态性的实践

使用多态性的实践

已在 Random-ZH 群组中发布
你好!今天我们即将完成有关OOP原理的一系列讲座。在本课中,我们将讨论多态性。 使用多态性的实践——1多态性是指将多种类型视为同一类型的能力。在这种情况下,对象的行为将根据它们所属的类型而有所不同。 让我们更详细地看看这个声明。让我们从第一部分开始:“处理多种类型的能力,就好像它们是同一类型一样。” 不同的类型怎么可能是同一种呢?听起来有点奇怪:/实际上很简单。例如,这种情况是在正常使用继承时出现的。让我们看看它是如何工作的。假设我们有一个简单的父类,Cat只有一个方法run()- “run”:
public class Cat {

   public void run() {
       System.out.println("Бег!");
   }
}
现在让我们创建三个继承于Cat: LionTiger和的类Cheetah,分别表示狮子、老虎和猎豹。
public class Lion extends Cat {

   @Override
   public void run() {
       System.out.println("Лев бежит со speedю 80 км/ч");
   }
}

public class Tiger extends Cat {

   @Override
   public void run() {
       System.out.println("Тигр бежит со speedю 60 км/ч");
   }
}

public class Cheetah extends Cat {

   @Override
   public void run() {
       System.out.println("Гепард бежит со speedю до 120 км/ч");
   }
}
所以我们有3节课。让我们模拟一种情况,我们可以像他们是同一类一样与他们一起工作。让我们想象一下,我们的一只猫生病了,需要艾博利特医生的帮助。让我们尝试创建一个Aibolit能够治疗狮子、老虎和猎豹的类。
public class Aibolit {

   public void healLion(Lion lion) {

       System.out.println("Лев здоров!");
   }

   public void healTiger(Tiger tiger) {

       System.out.println("Тигр здоров!");
   }

   public void healCheetah(Cheetah cheetah) {

       System.out.println("Гепард здоров!");
   }
}
看起来问题已经解决了——类已经编写完毕并且可以使用了。但如果我们想扩展我们的计划,我们该怎么办呢?现在我们只有3个物种:狮子、老虎和猎豹。但世界上有40多种猫。想象一下,如果我们在程序中为帕拉斯猫、美洲虎、缅因猫、家猫和其他猫添加单独的类别,将会发生什么。 使用多态性的实践——2当然,程序本身会起作用,但班级Aibolit必须不断添加新的方法来治疗每种类型的猫,结果它将增长到前所未有的规模。这就是多态性的特性发挥作用的地方——“处理多种类型的能力,就好像它们是同一类型一样。” 我们不需要创建无数的方法来做同样的事情——治疗猫。一种方法足以同时满足所有情况:
public class Aibolit {

   public void healCat(Cat cat) {

       System.out.println("Пациент здоров!");
   }
}
healCat()我们可以将对象LionTiger对象传递 给该方法Cheetah- 它们都是Cat
public class Main {

   public static void main(String[] args) {

       Aibolit aibolit = new Aibolit();

       Lion simba = new Lion();
       Tiger sherekhan = new Tiger();
       Cheetah chester = new Cheetah();

       aibolit.healCat(simba);
       aibolit.healCat(sherekhan);
       aibolit.healCat(chester);
   }
}
控制台输出:

Пациент здоров!
Пациент здоров!
Пациент здоров!
这就是我们的类Айболит可以处理不同类型的方式,就好像它们是同一类型一样。现在让我们处理第二部分:“在这种情况下,对象的行为将根据它们所属的类型而有所不同。” 这里的一切也很简单。在自然界中,所有猫的奔跑方式都不同。至少,他们的跑步速度是不同的。在我们的三种宠物中,猎豹跑得最快,而老虎和狮子跑得较慢。也就是说,他们的行为是不同的。多态性不仅使我们能够将不同的类型合而为一。同时,它使我们不会忘记他们的差异,并保留他们每个人特有的行为。通过这个例子就可以理解这一点。假设在成功康复后,我们的猫决定跑来跑去庆祝一下。让我们将其添加到我们的类中Aibolit
public class Aibolit {

   public void healCat(Cat cat) {

       System.out.println("Пациент здоров!");
       cat.run();
   }
}
让我们尝试运行相同的代码来治疗三种动物:
public static void main(String[] args) {

   Aibolit aibolit = new Aibolit();

   Lion simba = new Lion();
   Tiger sherekhan = new Tiger();
   Cheetah chester = new Cheetah();

   aibolit.healCat(simba);
   aibolit.healCat(sherekhan);
   aibolit.healCat(chester);
}
结果如下:

Пациент здоров!
Лев бежит со speedю 80 км/ч
Пациент здоров!
Тигр бежит со speedю 60 км/ч
Пациент здоров!
Гепард бежит со speedю до 120 км/ч
在这里,我们清楚地看到,尽管我们将所有三种动物传递到一个方法中,并将它们“概括”为 ,但我们的对象的特定行为被保留了Cat。由于多态性,Java 完美地记住了这不仅仅是三只猫,而是一只狮子、一只老虎和一只猎豹,它们的奔跑方式不同。这是使用多态性的主要优点——灵活性。当我们需要创建一些多种类型共有的功能时,狮子、老虎和猎豹就会变成“猫”。所有动物都是不同的,但在某些情况下 - 猫就是猫,无论它属于什么物种:) 这是为您提供的视频确认。
当不需要这种“概括”,相反我们需要物种的行为不同时,每种类型的行为都不同。由于多态性,您可以为各种类创建单个接口(方法集)。因此,程序的复杂性降低了。即使我们将程序扩展到 40 种猫,我们仍然会拥有最简单的界面 - 一种方法run()适用于所有 40 种猫。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION