A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何红卫 中级黑马   /  2013-3-20 20:02  /  2605 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 何红卫 于 2013-3-21 20:20 编辑

今天学到接口引用的时候,敲代码出来的结果发现接口引用没什么意义,这个所谓的多态意义何在
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;

  5. namespace test8
  6. {
  7.     //定义一个人类行为的接口,里面有一个打招呼的方法的签名
  8.     public interface IPersonBehaviour
  9.     {
  10.         void SayHello();
  11.     }
  12.     //学生类,继承了IPersonBehaviour接口
  13.     public class Student:IPersonBehaviour
  14.     {
  15.         public string name;
  16.         public int age;
  17.         public string hobby;
  18.         //实现了接口的SayHello()方法
  19.         public void SayHello()
  20.         {
  21.             Console.WriteLine("大家好,我叫{0},我今年{1}岁了,我的爱好是{2}", name, age, hobby);
  22.         }
  23.     }
  24.     class Program
  25.     {     
  26.         static void Main(string[] args)
  27.         {
  28.             Student stu = new Student();      
  29.             stu.name = "张三";
  30.             stu.age = 18;
  31.             stu.hobby = "打羽毛球";
  32.             stu.SayHello();     //输出:大家好,我叫张三,我今年18岁了,我的爱好是打羽毛球

  33.             IPersonBehaviour s = new Student();//使用接口引用的方式
  34.             s.SayHello();       //输出:大家好,我叫,我今年0岁了,我的爱好是

  35.             Console.ReadKey();
  36.         }
  37.     }
  38. }
复制代码
一个类一般也不可能只简单到只实现了继承接口的方法吧,定义了这个接口引用只能调用接口的方法,如果这个被类实现的方法内部使用了类本身的变量,这个调用也得不到我们想要的结果,(Student)s.name = "张三";做这种强制转换貌似也不行,按道理应该可以的。与其要使用接口引用去调用实现了接口的方法,还不如就用这个的类的对象去调用,难道为了多态而多态,求指导。

评分

参与人数 1技术分 +1 收起 理由
杞文明 + 1

查看全部评分

5 个回复

倒序浏览
1. 接口具有不变性,但这并不意味着接口不再发展,类似于类的继承性,接口也可以继承和发展;
2. 接口继承只是说明继承,也就是说,派生类可以继承基类的方法实现,而派生类的接口只继承了父接口的成员方法说明,而没有继承父接口的实现;
3. C#中类继承只允许单继承,但是接口继承允许多继承,一个子接口可以有多个父接口;
4. 下面例子中, TextBox中的Paint方法覆盖了Control中的Paint方法,但是没有改变Control.Paint对IControl.Paint的映射。
   interface  IControl
   {
        void Paint();
   }
  class   Control:IControl
  {
       public void Paint(){ ... }
  }
  class  TextBox:Control
  {
       new public void Paint(){...}
  }
  

评分

参与人数 1技术分 +1 收起 理由
杞文明 + 1

查看全部评分

回复 使用道具 举报
许庭洲 发表于 2013-3-20 20:47
1. 接口具有不变性,但这并不意味着接口不再发展,类似于类的继承性,接口也可以继承和发展;
2. 接口继承 ...

呵呵,没看懂,而且我说的是接口引用,不是接口本身的作用
回复 使用道具 举报
这位同学对多态的理解不是很明白。
    多态是继承同一个类或者实现了同一个接口的多个子类,通过父类或者接口的对象调用父类或者接口的方法,而表现出来的多种不同行为。
    多态需要在使用多个子类的时候才能体现其明显的好处,而接口类型一般作为方法的参数类型或者方法返回值类型。从而使得增加了程序的扩展性和代码的复用性,也符合编程的开闭原则。

    用得多了,也就明白了。具体例子就不给了,上网查一下,很多资料的 。
回复 使用道具 举报
曾玉锋 发表于 2013-3-21 01:16
这位同学对多态的理解不是很明白。
    多态是继承同一个类或者实现了同一个接口的多个子类,通过父类或者 ...

我明白多态的含义,因为我是为了求解接口引用的作用,不是为了问多态的意义,所以把别的实现了这个接口的类删了。不过你说到后面的作为方法的参数类型或者方法返回值类型我就明白了,我自己定义一个接口引用没什么意义,用来做为方法的参数类型或者方法返回值类型就真正体现多态的方便了,谢谢!
回复 使用道具 举报
首先要明白接口的作用:1.它是一种规范。只有遵循了这种规范,才可以进行其他操作。也方便程序的管理
就像你程序里的,定义了接口和接口里的方法,其他类继承接口,就必须要实现它的方法。
2.接口是一种约束。其实跟第1条大同小异。规范和约束大于编码,这是程序员必须具备的思想。
不知道我说的你听不听得懂……
回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马