黑马程序员技术交流社区

标题: 怎么实现多态啊 [打印本页]

作者: kimi    时间: 2013-6-6 17:59
标题: 怎么实现多态啊
方法的重载是不是多态的一种表现?
作者: 无__畏    时间: 2013-6-6 18:17
多态必须具备三大特征:子类继承父类,子类覆盖父类,父类指向子类。
重载因为针对的是方法,违反了面向对象的概念。
而面向对象的三大特性之一是多态,所以重载不是面向对象,而是面向方法,故不是多态。

我对面向对象了解也不够
作者: zpzhangwenhan    时间: 2013-6-6 21:11
自己写的代码,自己看 有注释
  1. class Program
  2.     {
  3.         static void Main(string[] args)
  4.         {
  5.             Chinese c1 = new Chinese();
  6.             c1.SayHello();

  7.             Person p1 = c1; //p1是Person类型的变量,先去看Person中的方法,发现是virtual
  8.             //所以去看p1指向的对象的实际类型Chinese有没有覆盖SayHello,如果有则调用实际类型的方法
  9.             p1.SayHello();
  10.             ////////////////////////////           
  11.             Console.WriteLine(p1.ToString());

  12.             //obj指向的是Chinese类对象,调用用ToString()的时候发现object的ToString是virtual方法
  13.             //所以看Chinese有没有override ToString方法,如果有则调用Chinese的ToString()
  14.             //如果Chinese没有override ToString()方法 则看Chinese的父类有没有override ToString()方法
  15.             object obj = p1;
  16.             obj.ToString();


  17.             Console.ReadKey();
  18.         }
  19.     }
  20.     //
  21.     class Person
  22.     {
  23.         public virtual void SayHello()
  24.         {
  25.             Console.WriteLine("person");
  26.         }
  27.         //重写父类Object的 ToString()方法
  28.         public override string ToString()
  29.         {
  30.             return "我是一个人";
  31.         }

  32.     }
  33.     //
  34.     class Chinese:Person
  35.     {
  36.         public override void SayHello()
  37.         {
  38.             Console.WriteLine("Chinese");
  39.         }
  40.     }
  41.     //
  42.     //
  43.     class BJ : Chinese
  44.     {
  45.         public override void SayHello()
  46.         {
  47.             Console.WriteLine("我是北京人");
  48.         }
  49.     }
复制代码

作者: 李奔    时间: 2013-6-7 00:01
无__畏 发表于 2013-6-6 18:17
多态必须具备三大特征:子类继承父类,子类覆盖父类,父类指向子类。
重载因为针对的是方法,违反了面向对 ...

童鞋的回答貌似不太正确。
  1. 重载因为针对的是方法,违反了面向对象的概念。
复制代码
这句话是不是不太正确啊?
我的理解是方法的重载是面向对象,它是多态的一种表现。
重载也是一种多态,不过是一种特殊的多态,是编译时决定的静态多态。
作者: 无__畏    时间: 2013-6-7 00:33
本帖最后由 无__畏 于 2013-6-7 00:38 编辑
李奔 发表于 2013-6-7 00:01
童鞋的回答貌似不太正确。这句话是不是不太正确啊?
我的理解是方法的重载是面向对象,它是多态的一种表 ...
谁(对象)去做了什么事情(方法)...
这个可以留给黑马的老师:lol


作者: ljh4282158    时间: 2013-6-10 22:37
多态可以简单的概述为“一个接口。多种方法”。方法的重载,应该也算是多态应该也算是多态的一种表现吧
作者: yangaidongcumt    时间: 2013-6-12 10:47
实现多态一般有4种方式:1.方法重载是多态的一种形式   2.使用虚方法实现多态 3.使用抽象类实现多态  4.使用接口实现多态
如果还有什么问题,我们可以具体交流一下!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2