该篇引用 CLR via C# 中的13.11节。

  应该设计基类还是接口,这个问题不能一概而论,下面提供一些指导性原则:

  1. IS_A关系(指属于,例如汽车属于交通工具) vs CAN_DO关系(指能做某事,例如一个类型能将自己的实例转换另一个类型)  类型只能继承一个实现。如果派生类型不具有与基类的IS_A关系,就不应使用基类,而应该使用接口。接口意味着CAN_DO关系。如果多种对象类型都具有CAN_DO功能,就使用接口。例如,一个类型能将自己的实例转换成另一个类型,一个类型能序列化自己的实例等。注意,值类型必须从System.ValueType派生,所有他们不能从任何基类派生。这种情况下,必须使用一个CAN_DO关系,并定义一个接口;

  2. 易于使用  对开发人员而言,定义一个从基类派生的新类型通常比实现一个接口的所有方法容易得多。基类型可提供大量功能,所有派生类型可能只需要针对其行为稍作改动。如果提供接口,新类型必须实现所有成员;

  3. 一致性的实现  不管一个接口的契约文档做得有多好,都无法保证任何人都能百分之百地正确实现它。事实上,COM颇受这个问题之累,这个问题导致有的COM对象只能正确用于Microsoft Office Word。如果为基类型提供了一个良好的默认实现,那么一开始使用的就是一个正常工作并进行了良好测试的类型,以后只需要根据自己的需要进行修改;

  4. 版本控制  向基类添加一个方法,派生类将继承新方法。一开始使用的就是一个能正常工作的类型,用户的源代码甚至不需要重新编译。向接口添加一个新成员,会强迫接口的继承者更改其源代码并重新编译。

  也可以同时提供接口,及实现了该接口的基类。

基类VS接口的更多相关文章

  1. C#编程语言与面向对象——抽象基类与接口

    在一个类前加“abstract”关键字,此类就成为抽象类. 对应的,在一个方法前加“abstract”关键字,此方法就成为抽象方法. abstract class Fruit //抽象类 { publ ...

  2. C#之基类及接口

    Component类: Component是公共语言运行库中按引用封送的所有组件的基类.Component提供IComponent接口的基实现并启用应用程序之间的对象共享. https://msdn. ...

  3. 6、面向对象以及winform的简单运用(抽象基类与接口)

    抽象类与抽象方法 1.书写规范: 在类前面加上abstract关键字,就成为了抽象类:在一个方法前面加上abstract关键字,就成为了抽象方法(抽象方法不能有实现方法,直接在后面加分号) 例: ab ...

  4. DDD的实体、值对象、聚合根的基类和接口:设计与实现

    1 前置阅读 在阅读本文章之前,你可以先阅读: 什么是DDD 2 实现值对象 值对象有两个主要特征:它们没有任何标识.它们是不可变的. 我们举个例子:小明是"浙江宁波"人,小红也是 ...

  5. 类,抽象基类,接口类三者间的区别与联系(C++)

    结构上的区别: 普通类:数据+方法+实现 抽象类:数据+方法(一定包含虚方法n>=1)+部分方法的实现 接口类:方法(纯虚方法) http://www.cnblogs.com/Tris-wu/p ...

  6. 一个关于C#中基类与接口混合继承的疑问总结

    思路参照 http://www.cnblogs.com/allenlooplee/archive/2004/11/16/64553.html,对原文进行了简化和补充,感谢原作者. 问题很简单,如下所示 ...

  7. C# 获取基类或者接口的所有继承类方法

    static class ReflectionHelper { public static IEnumerable<T> CreateAllInstancesOf<T>() { ...

  8. C# 关于接口与基类的理解(二者的区别)

    接口(接口的名称一般用大写字母I开头的)是把公共实例(非静态)方法和属性组合起来,以封装特定功能的一个集合.(其实,接口简单理解就是一种约定,使得实现接口的类或结构在形式上保持一致) 注意:使用接口可 ...

  9. Fluent_Python_Part4面向对象,11-iface-abc,协议(接口),抽象基类

    第四部分第11章,接口:从协议到抽象基类(重点讲抽象基类) 接口就是实现特定角色的方法集合. 严格来说,协议是非正式的接口(只由文档约束),正式接口会施加限制(抽象基类对接口一致性的强制). 在Pyt ...

随机推荐

  1. 问题解决 Visual Studio 2015 无法复制文件“D:\swapfile.sys”

    莫名其妙的问题..度娘 必应统统不给力.. 还是找了谷大爷 严重性 代码 说明 项目 文件 行 列 类别 源 项目级别 工具 禁止显示状态错误 无法复制文件“D:\swapfile.sys”,原因是找 ...

  2. selenium 打开浏览器报错java.lang.NoSuchMethodError: org.openqa.selenium.chrome.ChromeOptions.addArguments([Ljava/lang/String;)

    java.lang.NoSuchMethodError: org.openqa.selenium.chrome.ChromeOptions.addArguments([Ljava/lang/Strin ...

  3. SPOJ - LIS2 Another Longest Increasing Subsequence Problem

    cdq分治,dp(i)表示以i为结尾的最长LIS,那么dp的递推是依赖于左边的. 因此在分治的时候需要利用左边的子问题来递推右边. (345ms? 区间树TLE /****************** ...

  4. Uva 10375 选择与除法 唯一分解定理

    题目链接:https://vjudge.net/contest/156903#problem/E 题意:已知 求:C(p,q)/C(r,s) 其中p,q,r,s都是10^4,硬算是肯定超数据类型的. ...

  5. vuejs组件参数校验

    父组件向子组件传递一些参数,那么子组件有权对这些参数进行一个校验,这个就是组件参数校验 需求:父组件传递过来的必须是个字符串,这个要怎么去校验呢 <div id='root'> <c ...

  6. 2017.11.29 JSP+Servlet 中功能验证码及验证的实现

    源代码如下: validate.jsp <%@ page language="java" import="java.util.*" pageEncodin ...

  7. map和set的遍历

    map: 1.通过获取Entry:  Entry的iterator for(Map.Entry<Float,String> entry : map.entrySet()) { System ...

  8. CSS中margin: 0 auto;样式没有生效

    问题:有两个元素: A, B.两则是嵌套关系,A是B的父节点.A和B都是块元素.当在A上设置:margin: 0 auto的时候,B并没有在页面中居中. margin: 0 auto 为什么没有生效? ...

  9. DB总结1

    DBA  重构 data  new york   committee   cobol codasyl  journal DDL  DML    关系演算  域关系演算语言(QBE)  元祖关系演算语言 ...

  10. python读写dbf数据库

    dbf数据库作为一种简单的数据库,曾经广泛使用.现在在金融领域还是有很多的应用之处,工作中遇到此类的问题,在此记录一下. 1. 读取dbf ''' 读取DBF文件 ''' def readDbfFil ...