图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的派生类吗?这两个沾边吗?
3个C#中接口的多态性的问题。
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
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的代码,是不是就不用修改了?
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 #MATLAB仿真#车辆换道路径规划
- ¥15 java 操作 elasticsearch 8.1 实现 索引的重建
- ¥15 数据可视化Python
- ¥15 要给毕业设计添加扫码登录的功能!!有偿
- ¥15 kafka 分区副本增加会导致消息丢失或者不可用吗?
- ¥15 微信公众号自制会员卡没有收款渠道啊
- ¥100 Jenkins自动化部署—悬赏100元
- ¥15 关于#python#的问题:求帮写python代码
- ¥20 MATLAB画图图形出现上下震荡的线条
- ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘