从一个例子理解多态(附代码解释)

首先我来说一下多态这个名字是什么意思,多态的英文词是polymorphism,poly的意思是许多,morph的意思是形态。所以多态的意思说白了就是许多形态。那么这许多形态是指谁的形态呢,它是说不同对象有着相同轮廓,但是在执行的时候会表现出多种的姿态。用我的例子来说,网络游戏中的诸多角色,如法师和战士。他们的类中都应该有一个跑的方法,但是跑起来的样子却并不一样。为了解释这个问题,我下面提供了一段代码。

这个例子中有一个Ren类
public class Ren {

 private String name;
 private String sex;
 
 public void run(){
  
 }
}


MT(战士)类
public class MT extends Ren{

 @Override
 public void run() {
  System.out.print("战士跑");
 }
}

FS(法师)类
public class FS extends Ren{

 @Override
 public void run() {
  System.out.print("法师跑"); 
 }
 
 
}
 

Run类
public class Run {
 public void niPao(Ren r){
  r.run();
 }

}

Test类

public class Test {

 /**
  * @param args
  */
 public static void main(String[] args) {
  /*
   多态性是允许将父对象设置成为和一个或多个它的子对象相等的技术,
   比如Parent:=Child; 多态性使得能够利用同一类(基类)
   类型的指针来引用不同类的对象,以及根据所引用对象的不同 ,
   以不同的方式执行相同的操作.
   多态的作用:把不同的子类对象都当作父类来看,
   可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,
   以适应需求的不断变化。
   */
  MT m1=new MT();
  FS f1=new FS();
  FS f2=new FS();
  
  Run r=new Run();
  //如果是法师1
  r.niPao(f1);
  //如果是法师2
  r.niPao(f2);
  //如果是战士1;
  r.niPao(m1);

 }

}

运行Test类出现的结果是 法师跑,法师跑,战士跑。可见体现了多态性的同样的轮廓,不同种姿态的特性。

这是说明多态名字为什么这么叫,但是这样的名字有什么好处呢。好处是可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。

最重要的是适应不断需求的变化,假设这个游戏随着玩的人越来越多,想要多设一个角色GJS,那么此时,我们需要做的只是加一个弓箭手类如下,而并不需要多修改别处的代码。然后我们再在Test类中测试,看会出现什么结果
public class GJS extends Ren{

 @Override
 public void run() {
  
  System.out.print("弓箭手跑");
 }
}

public class Test {

 /**
  * @param args
  */
 public static void main(String[] args) {

  MT m1=new MT();
  FS f1=new FS();
  FS f2=new FS();
  
  GJS g=new GJS();
  Run r=new Run();
  //如果是法师1
  r.niPao(f1);

  //如果是法师2
  r.niPao(f2);

  //如果是战士1;
  r.niPao(m1);
 //如果是弓箭手
  r.niPao(g);
 }

在运行的结果中我们会发现最后的一项是弓箭手的一项。

这样利用多态性,我们对这个游戏实现了一个完美的扩展,在尽量少的修改(甚至不修改)原有的代码的基础上,实现了我们要干的事情。这是一件了不起的事情。在我们慢慢做一些项目,开始一些开发的时候会发现这一个特性会改变许多事情。多态性,不亏是OOP中很重要的一个特性。(在我看来这是有了封装和继承的特性之后才有的一个特性。)

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
由于C语言本身不支持多态,因此需要通过结构体和函数指针来模拟多态。 下面是一个简单的例子: ```c #include <stdio.h> // 定义一个基类 Animal typedef struct { void (*speak)(); } Animal; // 定义一个子类 Dog typedef struct { Animal base; char* name; } Dog; // 定义一个子类 Cat typedef struct { Animal base; char* name; } Cat; // Dog 的 speak 实现 void dog_speak() { printf("汪汪汪!\n"); } // Cat 的 speak 实现 void cat_speak() { printf("喵喵喵!\n"); } int main() { // 创建一个 Animal 类型的指针 Animal* animal; // 创建一个 Dog 对象,并将其地址赋值给 animal 指针 Dog dog = {{dog_speak}, "小狗"}; animal = (Animal*)&dog; // 调用 speak 函数,输出 "汪汪汪!" animal->speak(); // 创建一个 Cat 对象,并将其地址赋值给 animal 指针 Cat cat = {{cat_speak}, "小猫"}; animal = (Animal*)&cat; // 调用 speak 函数,输出 "喵喵喵!" animal->speak(); return 0; } ``` 代码分析: 1. 定义了一个基类 Animal,其中包含一个函数指针 speak。 2. 定义了两个子类 Dog 和 Cat,分别继承自 Animal。 3. 分别实现了 Dog 和 Cat 的 speak 函数。 4. 在主函数中,创建了一个 Animal 类型的指针 animal。 5. 创建一个 Dog 对象,并将其地址赋值给 animal 指针。 6. 调用 animal 指针的 speak 函数,输出 "汪汪汪!"。 7. 创建一个 Cat 对象,并将其地址赋值给 animal 指针。 8. 调用 animal 指针的 speak 函数,输出 "喵喵喵!"。 多态的好处: 1. 提高代码的可读性和可维护性。多态可以使代码更加简洁清晰,易于理解和修改。 2. 提高代码的复用性。通过多态,可以将相同的代码封装在一个基类中,从而可以在不同的子类中共享这些代码。 3. 提高代码的可扩展性。通过多态,可以轻松地添加新的子类,而不需要改变原有的代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yxnchinahlj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值