C#中增量类功能的方式之 继承与扩展
之前一次公司培训的时候,将它记录下来,https://www.cnblogs.com/AlvinLee/p/10180536.html这个博客上面比较全面。
1、扩展方法
扩展方法是一种特殊的静态方法,可以像该类的实例方法一样使用,能够在不添加新的派生类,重新编译的情况下,向现有类添加功能
注意事项:
a、必须定义在非泛型静态类中
b、必须是public的静态方法,并且第一个方法必须使用this关键字修饰
c、使用using关键字显示导入扩展方法命名空间后才能使用
d、实例方法优先于扩展方法执行
e、可以在空引用上调用扩展方法
f、扩展方法可以被继承
2、partial
partial关键字拆分一个类、结构、接口、方法的定义至多个文件中,每个源文件中包含类型或方法定义的一部分,在编译时被组合成一个完整的类。
使用场景:
a、一个类分布于多个独立文件中跨域让多位程序员同事对该类进行处理
b、当使用自动生成文件的源文件时,将自动生成的代码与手动添加的代码分布在不同文件
注意事项:
a、不分类的各个部分必须具有相同的可访问性
b、如果将任意部分声明为抽象类
c、如果任意部分声明了其基类型,则整个类继承该类
d、部分类的各个部分都必须在同一程序集和同一模块(.exe 或 .dll 文件)中进行定义。
e、部分方法必须以partial开头,不能包含out参数,不能为virtual方法,返回值必须为void
f、可以为已定义并实现的分部方法生成委托,但不能为已经定义但未实现的分部方法生成委托
3、继承
a、面向对象的三大特征之一
b、通过继承可以重用、扩展、修改积累中的行为
c、基类具有传递性
Struct结构是否支持继承?
如何防止类被进一步派生?
如何在派生类中隐藏类成员?
继承缺点:
a、类只支持单继承
b、破坏封装,子类与父类之间紧密耦合,子类依赖于父类的实现,子类缺乏独立性,基类细节对派生类可见
c、子类不能改变父类的接口
e、不支持动态继承,在运行时,子类无法选择不同的父类
4、继承之模板方法
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可冲定义该算法的某些特定步骤
使用场景:
a、有多个子类共有的方法,且逻辑相同
b、重要的、复杂的方法,可以考虑作为模板方法
优点:
a、封装不变部分,扩展可变部分
b、提取公共代码,便于维护
c、行为由父类控制,子类实现
缺点:
每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大。
5、组合
什么是组合?
组合是通过对现有的对象进行拼装(组合)产生新的、更复杂的功能
优点:
a、不破坏封装,整体类与局部类之间松耦合,彼此相互独立
b、支持动态组合,在运行时可以设置不同的局部实现
c、整体可以对局部类进行包装,封装局部类的接口,提供新的接口
缺点:
a、创建整体类的对象时,需要创建所有局部类的对象
b、设计复杂度增高
6、建造者模式(在后续的文章中,会详细描述下设计模式)
建造者模式将一个复杂的构建与其表示相分离,是的同样的构建过程可以创建不同的表示
主要角色:
a、控制者(Director):控制对象的组合过程
b、构建者(Builder):构建者接口,定义构建各部件的方法。
c、实际构建者(ConcreteBuilder):具体构建出各部件对象,获得构造结构。
d、被创建者(Product):构建者操作的主要对象
使用场景:
a、被创建者对象由很多组件构成,他们之前创建的顺序不变,但是组件的创建细节不一致
b、被创建者对象具有复杂的内部结构
c、被创建者对象内部属性本身相互依赖
优点:
a、建造者独立,易扩展
b、便于控制细节风险
缺点:
a、产品必须有共同点,范围有限制
b、内部变化复杂,会有很多的建造类
C#中增量类功能的方式之 继承与扩展相关推荐
- .NET 中String类功能分类概述
一.比较功能 String.Compare: 成员函数 返回值 功能 String.Compare 小于零.零.大于零. 1.比较两个字符串的大小(按照一定规则) 2.比较两个字符串中子字符串的大小. ...
- java循环遍历_JAVA中循环遍历list有三种方式
转自:https://blog.csdn.net/changjizhi1212/article/details/81036509 JAVA中循环遍历list有三种方式for循环.增强for循环(也就是 ...
- 不应该通过类实例访问静态成员 解决方法_今天说一说php中的类与对象
网上的文章博客这种东西已经写烂了. 我只是写写自己理解.... 首先都知道php的面向对象,什么封装,集成,多态,灵活,简单,代码简洁,重用行强,利于维护,什么什么三个方向:灵活性,重用行,扩展性. ...
- Java的HttpClient类以POST方式提交数据,目标端收到后中文乱码
h ttpClient HttpMethod NameValuePair setRequestBody 今天开发时,遇到利用Java中HttpClient类以POST方式提交数据,目标收到后中文 ...
- C#中关于增强类功能的几种方式
C#中关于增强类功能的几种方式 本文主要讲解如何利用C#语言自身的特性来对一个类的功能进行丰富与增强,便于拓展现有项目的一些功能. 拓展方法 扩展方法被定义为静态方法,通过实例方法语法进行调用.方法的 ...
- java中怎样定义实数_Java Math 类中的新功能,第 1 部分: 实数
在这篇由两部分组成的文章中,Elliotte Rusty Harold 与您一起探讨经典 java.lang.Math 类中的"新"功能.第 1 部分主要讨论比较单调的数学函数.第 ...
- 在保护继承中基类的共有成员_C++学习大纲:继承方式的调整
C++ 继承方式的调整 在任何继承方式中,除了基类的private成员外,都可以在派生类中分别调整其访问控制. 调整格式 [public: | protected: | private: ] :: ; ...
- 模板类中使用友元函数的方式,派生类友元函数对基类的成员使用情况
在一般友元函数的前面加上 template<typename T),注意在函数的声明和定义处都要加这个模板 例如: //模板类,长方体类 template <typename Elemen ...
- VC6如何使用VS2005中的CImage类功能
由于VC6启动速度快,产生的执行代码小,还有可爱的类向导,所以许多C++程序员还工作在VC6环境中. 但是我们想在VC6中用VS2005中的新功能怎么办呢?例如CImage类(有很强的图像 ...
最新文章
- 8位数控分频器的设计_eda设计数控分频器(实现2~16)分频
- 1060 爱丁顿数 (25 分)(思维)
- c语言数组最大可定义多少位_C语言求数组的最大值三种方法
- 实战经验:Oracle Lost Write Detection机制导致Select产生大量Redo
- laravel 核心类Kernel
- 关闭MySQL日志,删除mysql-bin.0000*日志文件
- static library libs/libvpx/libvpx.a is not portable!
- python提供了什么函数进行格式化输出_python print函数格式化输出
- Uniapp使用GoEasy实现websocket实时通讯
- leaflet 加载海量点位,点击marker 查看详情功能
- 数据结构 Java数据结构 --- 二叉树
- 全国哀悼日,我们也把博客灰一下吧
- access操作mysql_Access数据库基础及应用(公选课) 第二章:Access2010数据库创建与操作...
- action的编写方式
- Idear常用快捷键
- Win10管理员用户被禁用,无法登陆系统
- 清除缓冲区的几种方法
- VScode 插件中 package.json 文件 activationEvents 字段详解
- 社交电商模式优化之报单产品
- dayjs一些常用封装