whyyouhitme_ 2018-05-27 16:04 采纳率: 57.1%
浏览 767
已采纳

3个C#中接口的多态性的问题。

图片说明
图片说明
图片说明
图1是关于接口多态性的讲述。有点看天书的感觉
图2是课后习题,习题4和5是关联的。其中题目5:“接受两个杯子对象中的任意一个”怎么理解?
图3是习题答案,其中参数列表中的HotDrink drink为什么是杯子对象?如果“Hotdrink drink”是两个杯子对象中的任意一个,按照题5中要求的“接受两个杯子对象中的任意一个”,那么另一个杯子对象是什么?(这个问题确实没水平,我还没get到C#的点)
另外,书中说“HotDrink drink不支持ICup 接口,但我们知道传
送给这个函数的两个cup 对象支持ICup 接口”
为什么我感觉它说的“传送给函数的两个cup对象”是HotDrink的两个派生类Cow和Chicken呢?(根据题目4的答案猜的)但是“传送给函数的两个cup对象(答案中表现为HotDrink drink)”和“派生类Cow、Chicken”有什么关系呢?HotDrink drink不是基类HotDrink的实例吗?而Cow、Chicken不是基类HotdDrink的派生类吗?这两个沾边吗?

  • 写回答

9条回答 默认 最新

  • threenewbee 2018-05-27 16:25
    关注
     这书编写的看似深入浅出,但是其实一点用没有,我们要知道,编程语言是一种工具,目的是为了更好地编写软件,而不是徒增概念去模拟现实世界。
    
    那么接口有什么用呢?
    
    比如说,我们要写一个通用的排序算法,注意通用两个字。比如说,我们的排序算法既要能对Room对象(给出房子长宽)的面积排序,也要能对Student对象(给出学生的姓名)按照名字排序。
    或者还是这个Student对象,我们按照成绩排序。
    我们发现,问题的关键在于,排序的依据每次都是不同的,不能写死在排序算法里,否则,这个排序算法通用不起来了。
    
    那怎么办呢,我们可以用接口。定义一个IComparer接口(实际上这个接口.net已经有了),这个接口有Compare方法。
    我们可以写出如下排序代码(比如最简单的,冒泡排序)
    void sort(object[] arr, IComparer c)
    {
    for (int i = 0; i < arr.Count -1; i++)
    for (int j = 1; j < arr.Count; j++)
    {
    if (c.Compare(arr[j] , arr[j - 1]) < 0)
    { object t = arr[j]; arr[j] = arr[j - 1]; arr[j - 1] = t; }
    }
    }
    注意看这个代码,我们调用接口去比较两个对象,而不是直接比较,那么比较的逻辑就独立于排序算法了。
    
    因此我们要排序学生的名字,我们只要传入一个实现了比较学生名字的比较对象,就可以了。
    class MyComparer : IComparer
    {
    public int Compare(object a, object b)
    {
    return (Student)a.Name.Compare((Student)b.Name);
    }
    }
    然后
    object[] arr = { stu1, stu2, stu3 };
    sort(arr, new MyComparer());
    如果要按照年纪排序呢,我们再定义一个类,或者修改上面的代码,用
    return (Student)a.Age - (Student)b.Age;
    
    而sort的代码,是不是就不用修改了?
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(8条)

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?