基类VS接口
该篇引用 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接口的更多相关文章
- C#编程语言与面向对象——抽象基类与接口
在一个类前加“abstract”关键字,此类就成为抽象类. 对应的,在一个方法前加“abstract”关键字,此方法就成为抽象方法. abstract class Fruit //抽象类 { publ ...
- C#之基类及接口
Component类: Component是公共语言运行库中按引用封送的所有组件的基类.Component提供IComponent接口的基实现并启用应用程序之间的对象共享. https://msdn. ...
- 6、面向对象以及winform的简单运用(抽象基类与接口)
抽象类与抽象方法 1.书写规范: 在类前面加上abstract关键字,就成为了抽象类:在一个方法前面加上abstract关键字,就成为了抽象方法(抽象方法不能有实现方法,直接在后面加分号) 例: ab ...
- DDD的实体、值对象、聚合根的基类和接口:设计与实现
1 前置阅读 在阅读本文章之前,你可以先阅读: 什么是DDD 2 实现值对象 值对象有两个主要特征:它们没有任何标识.它们是不可变的. 我们举个例子:小明是"浙江宁波"人,小红也是 ...
- 类,抽象基类,接口类三者间的区别与联系(C++)
结构上的区别: 普通类:数据+方法+实现 抽象类:数据+方法(一定包含虚方法n>=1)+部分方法的实现 接口类:方法(纯虚方法) http://www.cnblogs.com/Tris-wu/p ...
- 一个关于C#中基类与接口混合继承的疑问总结
思路参照 http://www.cnblogs.com/allenlooplee/archive/2004/11/16/64553.html,对原文进行了简化和补充,感谢原作者. 问题很简单,如下所示 ...
- C# 获取基类或者接口的所有继承类方法
static class ReflectionHelper { public static IEnumerable<T> CreateAllInstancesOf<T>() { ...
- C# 关于接口与基类的理解(二者的区别)
接口(接口的名称一般用大写字母I开头的)是把公共实例(非静态)方法和属性组合起来,以封装特定功能的一个集合.(其实,接口简单理解就是一种约定,使得实现接口的类或结构在形式上保持一致) 注意:使用接口可 ...
- Fluent_Python_Part4面向对象,11-iface-abc,协议(接口),抽象基类
第四部分第11章,接口:从协议到抽象基类(重点讲抽象基类) 接口就是实现特定角色的方法集合. 严格来说,协议是非正式的接口(只由文档约束),正式接口会施加限制(抽象基类对接口一致性的强制). 在Pyt ...
随机推荐
- 会话技术: Cookie Session JSP
## Cookie A..概念:客户端会话技术,将数据保存到客户端 B.使用步骤: 1.创建Cookie对象,绑定数据 new Cookie(String name, String value) ...
- Logback初始化失败问题排查(Web.xml中context-param配置详解)
监控部分反馈异常,生产系统日志文件竟然木有了(最后一次版本发布后,再也无日志文件生成). 问题排查步骤: 1. 检查logback配置文件 日志生成目录一切正常 应该服务器上磁盘空间未满.操作权限没有 ...
- input的类型为number,限制输入的数字位数
<input type="text" maxlength="5" /> 效果ok,当 <input type="number& ...
- django中的auth模块以及分页器
1.auth模块 auth模块是Django提供的标准权限管理系统,可以提供用户身份认证,和权限管理 auth可以和admin模块配合使用, 快速建立网站的管理系统 在INSTALLED_APPS中添 ...
- Python简单线程间通信
本节主要举一个简单的线程间通信的例子,利用线程安全的数据结构queue.Queue保存线程间通信的内容, import queue from threading import Thread from ...
- lincode 680 Split String
Split String 描述 笔记 数据 评测 Give a string, you can choose to split the string after one character or ...
- SSH 登录时出现如下错误:No supported key exchange algorithms
https://help.aliyun.com/knowledge_detail/41486.html
- Linux下配置npm存放路径,解决权限问题
1.打开cmd命令行,查看当前配置 输入 npm config ls 先看一下当前npm的配置环境,由于我已经修改过,所以可以看到修改后的路径 2.修改路径 这里需要修改两个路径,module路径和c ...
- 获取点击li的当前索引
获取点击li的当前索引 点击特定次序的li 展现特定的页面 $('.wgsb').find('.wangge_data_list li').click(function(){ var index=$ ...
- Eclipse搭建SpringBoot
第一种方法(不建议) 首先新建Maven工程 勾选第一个按钮,第三个是选择working set ,你可以不选 下一步,配置工程信息,注意打包为jar 打开pom.xml文件,添加spring-boo ...