zoukankan      html  css  js  c++  java
  • C#类设计时,何时用类继承(Base Class)何时用接口(Interface)

    www.free56.cn, Based from ‘CLR via C#’)
    Base class 和 Interface的使用,有时很容易判断,有时又很难区分。
    1)二者的主要区别:Base class 体现了“IS A”的关系,而Interface体现的是“CAN DO”的关系。因为C#不允许多重继承(Multi-inherit),所以,如果派生的类不能正确的反映IS-A的关系,就不要使用基类;而如果不同的类或对象(Type)包含了同样的CAN-DO的功能,那么就用接口。另外,值类型(Value type)只能使用接口,不能使用Base Class;
    2)相比Interface,使用Base Class的有点:
      i)使用方便(Easy of use):基类提供了大量现成的方法、功能,子类可以直接使用;而使用接口时,必须定义接口规定的所以的成员;
      ii)执行稳定(consistent implementation): 不管关于接口的文档的描述有多么完善,其他人(第三方)在根据接口完善类时,也都会遇到很多问题,不可能做到100%的准确,这样就导致了bug的产生,而使用基类方式,定义一个可以正确执行的基类,而在派生类中适当的修改已达到最终需求,无疑会使程序更加稳定,出问题的几率更小;
      iii)扩展(Versioning):如果给基类增加新的方法(method),那么,继承的子类可能无需编译即可使用基类中新增加这些方法;而使用接口的话,就不这么容易了,接口中增加新的声明后,必须在子类中去实现(implement)这些新增的方法。
    3)使用interface的一些情况:对于那些提供的相对稳定(consistent)的操作的类,最好给它们定义一个统一的interface。 如,你的类中都有聚合对象(列表),都能够增加、插入、删除某一列表中的项目,那么,我们就可以让他们都继承与IList<T>接口,此时,你就可以对你的那些类进行增加、插入、删除等操作,而无需知道他们的具体类,因为你知道他们都实现了IList<T>接口的方法。
    4)当然,有时定义接口和使用类继承效果没什么区别,如实现Compare功能,FLC提供了ICompareer<T>和Comparer<T>的抽象类供继承。看你的习惯了:)

  • 相关阅读:
    markdown 常用语法 (在macdown内使用正常)
    C# MessageBox常用用法
    C# 正则表达式匹配汉字
    C# 可视化读取文件、文件夹
    Xcode UUID查询
    Xcode 常用快捷键
    iOS __weak __strong WeakSelf StrongSelf
    iOS 图形图像动画 Core Animation
    iOS Runtime学习笔记
    iOS NSDate本地化
  • 原文地址:https://www.cnblogs.com/skywind/p/743002.html
Copyright © 2011-2022 走看看