翻了一半,到某些地方实在是看不下去了,鉴于这本书的名气和传说中的销售量,这些地方拿出来给大家讨论讨论,对看了这本书而又没发现这些东西的安达应该是有益的.

条款19:Prefer Defining and Implementing Interfaces to Inheritance。该条款教导我们,尽量定义并实现接口,而不是使用继承。
      实际上,抽象类具有一些接口不可能提供的特点。
      1、接口只是提供了实现类提供的行为,而没有提供这些行为的规范。如:一个调制解调器接口包括:拨号、发送数据、接收数据、挂断这些行为,但是并没有也没办法定义说发送数据之前,必须得先拨号,且拨号必须成功这样的规范;但是抽象类不同,它可以定义它们。
      2、在抽象类中增加一项功能,它的派生类就自动拥有了这些功能;这东西显然通过接口实现不了——在接口中增加一向功能的后果是所有的实现类都得重写,并重新编译。
      在实际项目中,碰到过这种让人非常头痛的情况。所以一般做法是提供接口,然后提供一个实现了这个接口的抽象类。派生类一般情况下是从抽象类派生,而不是直接去实现接口。

OK,现在我们再来看<Effective C#>中提到的证明使用接口而不使用抽象类的反例:

public void PrintCollection( IEnumerable collection )
{
  foreach( object o in collection )
  Console.WriteLine( "Collection contains {0}",
    o.ToString( ) );
}

public void PrintCollection( CollectionBase collection )
{
  foreach( object o in collection )
  Console.WriteLine( "Collection contains {0}",
    o.ToString( ) );
}

书里面说了
“The second method is far less reusable. It cannot be used with Arrays, ArrayLists, DataTables, Hashtables, ImageLists, or many other collection classes. Coding the method using interfaces as its parameter types is far more generic and far easier to reuse.”大体意思是第二个方法可用性很差劲,它不能使用诸如:Arrays、ArrayLists、DataTables等等,使用第一种使用接口做参数方法就很好,用起来很方便。
      现在的问题是:谁会这么写代码呢?作为一个方法的参数,它可能会有一些限制,比如上述的PrintCollection。对该方法的实现,唯一的限制是它得实现IEnumerable接口,只要入口参数实现了这个接口,方法就可以完成预定义的语义。第二种写法扩大了限制的范围,摆明了后果就是可用性降低。
      定义一个方法的入口参数类型,一个很重要的原则就是:最小限制化。
      该原则同样适用于泛型类和泛型方法的定义。

      它后面的例子犯的错误如出一辙。

吃饭时间到了,其他的忽悠稍后。^_^

-- 补充点东西,见文《补》

转载于:https://www.cnblogs.com/cn_wpf/archive/2007/07/19/823626.html

《Effective C#》某些地方实在是对不起Effective这个词(I)相关推荐

  1. effective c++_【阅读笔记】Effective C++()

    全文参考自Effective C++, Scott Meyers 程序来自本人 https://github.com/hxz1998/ccl 1. 让自己习惯C++ C++高效编程守则视状况而变化,取 ...

  2. Effective C++ 类与函数设计和申明

    Effective C++ 类与函数的设计和申明 在看<Effective C++>这本书的过程中,我无数次的发出感叹,这他妈写得太好了,句句一针见血,直接说到点上.所以决定把这本书的内容 ...

  3. Effective C++ -- 零散知识点整理

    Effective C++ --1让自己习惯C++ Effective C++ --2构造/析构/赋值运算 Effective C++ --3资源管理 Effective C++ --4设计与声明 E ...

  4. 不为人知的 35 个 More Effective C++ 改善编程与设计的最佳方法 | 原力计划

    作者 | fengbingchun 责编 | 屠敏 出品 | CSDN 博客 Scott Meyers大师Effective三部曲:Effective C++.More Effective C++.E ...

  5. Effective前端6:避免页面卡顿

    什么是页面卡顿?如下: 当拖动页面或者滚动的时候页面一卡一卡的,看起来不连贯,我们就说页面卡了,这是一种非常不友好的体验,怎么衡量页面卡顿的情况呢? 1. 失帧和帧率FPS 如果你家里买了电视盒的话, ...

  6. Real user ID, effective user ID, set user ID

    前段时间一直没搞明白这几个ID之间的关系,今天看到一篇博文,这才拨云见日,才有所了解了. real user ID:实际用户ID,指的是进程执行者是谁 effective user ID:有效用户ID ...

  7. 日本“女机器人”畅销全球,有三个地方最吸引人,网友:想拥有

    在这个科技时代,人们对于各种科技产品都有着浓厚的兴趣.女性机器人也是如此,让全球男性朋友们都为之"疯狂".而日本的女性机器人,则是女机器人市场上最受欢迎的了.几乎一度出现了供不应求 ...

  8. “大”北京“小”地方

    北京太大,光世界遗产就无数,逛在北京的人,看惯了北京的大,却常常忽视它的"小".给大家推荐几处值得一去的"小地方",给您的北京生活增添一些新的乐趣.   北京值 ...

  9. 地方门户网站盈利的“达摩五指”

    地方门户网站一直面临盈利能力弱,投资回报率低的问题.业内一直流传着这样几句名言: 1.门户化和电子商务化: 2.房产.汽车.家居.婚庆是地方门户网站的主要盈利行业. 3.大行业做收入,小行业做内容. ...

最新文章

  1. mysql设置keepalived_MySQL高可用性之Keepalived+MySQL(双主热备)
  2. 计算机基础知识菜鸟教程,机器学习基础知识整理归纳
  3. LeetCode 863. 二叉树中所有距离为 K 的结点(公共祖先/ DFS+BFS)
  4. 分布式SQL学习总结(1)——蚂蚁金服资深总监韩鸿源:像使用集中式数据库一样使用OceanBase分布式数据库
  5. 20155222 卢梓杰 myod
  6. 扫描控件Web在线Applet
  7. 云服务器怎么多人进去编辑文档,一台云服务器多人使用
  8. NYOJ277 - 车牌号
  9. OBS+SRS+centos7搭建局域网直播推流服务器
  10. 生产排程系统_【经典文章】漫谈生产计划排程与控制系统
  11. 转载:《星际争霸》星际争霸战略战术的发展和创新
  12. Topaz DeNoise AI for Mac(AI智能图像降噪工具)
  13. Entity Framework Core系列教程-23-原生SQL查询
  14. gis 六边形网格_ArcGIS中实现指定面积蜂窝(正六边形)方法
  15. 倍福TwinCAT3 的OPC_UA通信测试案例
  16. Ubuntu16.04开机后黑屏无法进入登陆界面的解决办法
  17. Cesium常用事件,包括点击事件,鼠标事件,相机移动事件
  18. java mcu 视频会议_详解视频会议终端和MCU的区别
  19. ADRC——ESO扩张状态观测器simulink实现(含代码)
  20. javaCV开发详解之8:转封装在rtsp转rtmp流中的应用(无须转码,更低的资源消耗)

热门文章

  1. 初识OSGI.NET插件框架
  2. 数组最大最小值比较次数优化
  3. Java语言学习思维导图
  4. MySQL笔记2: count() 函数和 sum() 函数用法和区别
  5. springboot:SpringBoot项目启动成功,但无法访问且提示404
  6. [Step By Step]SAP HANA创建层次结构的属性视图(Hierarchy Attribute View)
  7. Puppet基础篇9-Puppetmaster多环境配置
  8. 找一个可以@user的gem。
  9. TensorFlow ImportError: (‘Failed to import pydot. You must `pip install pydot`)
  10. C++ void类型指针的使用