.NET 设计规范--.NET约定、惯用法与模式--6.为扩展性而设计
6.1 扩展机制
6.1.1 非密封类
密封类即无法派生子类,也无法扩展。与此相反,非密封类可以派生子类进行扩展
//string cannot be inherited from
public sealed class String{}
//TraceSource can be inherited from
public class TraceSource{}
正因为如此,如果需要既简单有开销不大的扩展方法,那么没有声明任何虚成员或保护成员的非密封类时不错的选择。
考虑用不包含任何虚成员或保护成员的非密封类来为框架提供扩展性,这种方法的开销不高,用户也喜欢。
6.1.2 保护成员
保护成员本身并不能提供任何的扩展性,但它们能够加强派生子类这一扩展机制。
考虑将保护成员用于高级定制
要在对安全性。文档及兼容性进行分析时,把非密封类中保护成员作为公有成员来对待
6.1.3 事件与回调函数
回调函数是一种扩展机制,它使框架能够通过委托来调用用户代码,这些委托通常是作为方法的参数传递给框架的。
事件是一种特殊的回调函数,它为用户提供了一致的语法,使用户能够非常方便的把委托提供给框架
考虑使用回调函数来让框架能够执行用户提供的代码
考虑用事件来让用户定制框架的行为,这样就不需要用用户对面向对象设计有深入了解。
要游戏使用事件,而不是简单的回调函数,其原因在于广大开发人员更熟悉事件,而且事件与Visual Studio的statement completion特性集成在一起。
避免在对性能要求很高的API中使用回调函数。
要理解在调用委托时可以执行任何代码,这可能会引起安全性,正确行及兼容性的问题。
6.1.4 虚成员
与回调函数相比,虚成员的主要的缺点在于它的行为只能静态修改(在编译时修改),而回调函数的行为则可以动态修改(在运行时修改)。
不要使用虚成员,除非有合适的理由,同时你对设计、测试及维护虚成员的开销有清楚的认识。
在以扩展性为 名义做决定前,请确保你完全理解了自己对扩展的需求。
考虑只有在绝对必须的时候才用虚成员提供扩展性,并使用Template Method模式。
要优先使用受保护的虚成员,而不是公有虚成员。公有虚成员应该通过调用受保护的虚成员的方式来提供扩展性。
类的公有成员应该为类的直接使用者提供正确的功能集。虚成员的设计目的是为了让子类覆盖。而受保护的访问权限是一种很好的方法,可以对其使用范围加以限制。
6.1.5 抽象(抽象类型与抽象接口)
抽象就是描述一个协定但是并不为该协定提供完整实现的类型。抽象通常实现为抽象类或接口,并带有一些参考文档,来描述实现该协定类型必须具备的那些语义。
不要提供抽象,除非为该抽象开发出具体实现并用到该抽象的API队其进行过实际测试。
要在设计抽象时谨慎地选择抽象类或是抽象接口
考虑为抽象的具体实现提供参考测试。这类测试应该告诉用于,他们是否正确实现饿了协定。
6.2 基类
我们把基类限定为这样的类:其设计目的不是为了直接使用或提供常用的抽象,而是为了让其他类通过继承类重用它的默认实现。
考虑使用基类为抽象类,即使他们并不包含任何抽象成员。这能够清楚地告诉用户,设计这些类的目的的完全是为了让用户从他们派生自己的子类。
考虑把基类与用于主要场景的类型分开,放到单独的名字空间中。根据定义,基类是为了高级扩展而设计的,因此大多数用户对它们并不感兴趣。
避免在命名基类时使用“Base”后缀,如果该类会用于公用API。
6.3 密封
密封是一种阻止扩展的有效机制。开发人员既可以密封整个类,也可以密封类中的单个成员。密封整个类使用户不能自该类继承,而密封一个成员则使用户不能覆盖该成员。
不要把类密封起来,除非有恰当的理由。
把类密封起来的恰当理由包括:
类为静态类
类的保护成员保存了需要高度保密的机密信息
类继承了许多虚成员,把这些成员一个一个都密封起来的代价太高,还不如把整个类都密封起来。
类时attribute,需要能再运行的时候快速查找
不要在密封类中声明保护成员或虚成员
考虑在覆盖成员时将其密封
转载于:https://www.cnblogs.com/lufangtao/archive/2012/04/10/2441276.html
.NET 设计规范--.NET约定、惯用法与模式--6.为扩展性而设计相关推荐
- .NET 设计规范--.NET约定、惯用法与模式--附录:C#编程风格约定
1.通用风格约定 1.1 花括号的使用 要把左括号放在前一条语句的末尾 if(someExpression){ DoSomething(); } 要使右括号与左括号所在行的首行对齐,除非花括号内只有一 ...
- 《.NET设计规范 约定、惯用法与模式》读书笔记
如何写出好的.容易让人阅读的代码,我想是每一位软件工程师必备的技能吧.最近开始看<.NET设计规范>,在以后的时间里,同步更新自己的读书笔记. 转载于:https://www.cnblog ...
- .NET 设计规范--.NET约定、惯用法与模式--5.成员设计
方法.属性.事件.构造函数已经字段统称为成员. 5.1 成员设计的一般规范 5.1.1 成员重载 成员重载是指在同一个类型中创建两个或两个以上的成员,这些成员有相同的名字,唯一不同的是参数的数量或参数 ...
- 《C++编程惯用法——高级程序员常用方法和技巧》——2.9 静态对象的构造
本节书摘来自异步社区出版社<C++编程惯用法--高级程序员常用方法和技巧>一书中的第2章,第2.9节,作者: [美]Robert B. Murray ,更多章节内容可以访问云栖社区&quo ...
- 《C++编程惯用法——高级程序员常用方法和技巧》——2.7 Const
本节书摘来自异步社区出版社<C++编程惯用法--高级程序员常用方法和技巧>一书中的第2章,第2.7节,作者: [美]Robert B. Murray ,更多章节内容可以访问云栖社区&quo ...
- VR中多模式异步协作的挑战和设计考虑因素
VR中多模式异步协作的挑战和设计考虑因素 原作者: KEVIN CHOW, University of British Columbia, Canada CAITLIN COYIUTO, Univer ...
- java面试题31:结构型模式中最体现扩展性的模式是()
java面试题31:结构型模式中最体现扩展性的模式是() A:装饰模式 B:合成模式 C:桥接模式 D:适配器 蒙蔽树上蒙蔽果,蒙蔽树下你和我 结构型模式是描述如何将类对象结合在一起,形成一个更大的结 ...
- bs模式Java web,基于BS模式的即时通讯系统的设计与实现(MyEclipse)
基于BS模式的即时通讯系统的设计与实现(MyEclipse)(包含选题审批表,任务书,开题报告,中期检查表,毕业论文13000字,答辩记录,成绩评定册,源程序) 摘 要:即时通讯(Instant M ...
- vivado 如何创建工程模式_用Tcl定制Vivado设计实现流程
原标题:[Vivado使用误区与进阶]用Tcl定制Vivado设计实现流程 上一篇<Tcl在Vivado中的应用>介绍了Tcl的基本语法以及如何利用Tcl在Vivado中定位目标.其实Tc ...
最新文章
- 【大数据实时计算框架】Storm框架
- springboot 启动的时候报错 Error creating bean with name 'solrClient'
- spring mysql 注解_【Spring】SpringMVC之基于注解的实现SpringMVC+MySQL
- micropython微控制器_MicroPython:针对微控制器的Python
- PHP之星际设计模式下(转自lightsaber)
- 如何查看Activity任务栈以及dumpsys_activity命令的简要使用及介绍
- 木兰许可证专业解读及首批采用“木兰”开源项目列表
- 【渝粤教育】21秋期末考试网络金融10248k2
- Alexa | Alexa Auto SDK 概述
- 哲学家就餐问题python解决_哲学家进餐问题-3中解决方案
- Unity3D研究院之Inspector面板枚举的别名与排序(八十九)
- apq用linux镜像,apq模拟器如何使用 apq模拟器使用方法教程
- 一个投标经理的标书检查笔记,拿来就用!
- vue less 换肤
- Jmeter插件安装perfmon(服务器资源监控工具)
- fastadmin需要php,fastadmin修改后台入口提示 模块不存在:admin.php
- kettle学习教程
- Android ndk获取手机内部存储卡的根目录
- 「PS-CC2019新版教程」画板工具-基础篇
- 蓝牙模块HC05与HC06的连接
热门文章
- 如何在androidstudio中运行java程序
- 要做linux运维工程师的朋友,必须要掌握以下几个工具才行
- Linux修改终端显示前缀及环境变量
- Android之玩转MPAndroidChart让(折线图、柱形图、饼状图、散列图、雷达图)优雅的舞...
- Reconfigure CentOS+freeradius+daloradius again
- UIKeyboardTypeNumberPad 数字键盘添加完成按钮
- 在showModalDialog和showModelessDialog中提交form时不弹出新窗口
- 网上收集的关于iframe的自适应高度代码js的
- smarty模板引擎_6-Smarty的内置函数
- Android 获取SD卡路径和判断SD卡是否存在.