之前一次公司培训的时候,将它记录下来,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#中增量类功能的方式之 继承与扩展的更多相关文章

  1. C++中的类所占内存空间+继承中的成员访问控制

    C++学习之继承中的成员访问控制 C++中的类所占内存空间总结

  2. .NET 中String类功能分类概述

    一.比较功能 String.Compare: 成员函数 返回值 功能 String.Compare 小于零.零.大于零. 1.比较两个字符串的大小(按照一定规则) 2.比较两个字符串中子字符串的大小. ...

  3. 2018.11.19 Struts2中Action类的书写方式

    方式1: 方式2: 方式3

  4. Java 17 将要发布,补一下 Java 13 中的新功能

    本文章属于Java 新特性教程 系列,已经收录在 Github.com/niumoo/JavaNotes ,点个赞,不迷路. 自从 Oracle 调整了 Java 的版本发布节奏之后,Java 版本发 ...

  5. YbSoftwareFactory 代码生成插件【十九】:实体类配合数据库表字段进行属性扩展的小技巧

    实体类通常需要和数据库表进行了ORM映射,当你需要添加新的属性时,往往同时也需要在数据库中添加相应的字段并配置好映射关系,同时可能还需对数据访问组件进行重新编译和部署才能有效.而当你开始设计一个通用数 ...

  6. C#中关于增强类功能的几种方式

    C#中关于增强类功能的几种方式 本文主要讲解如何利用C#语言自身的特性来对一个类的功能进行丰富与增强,便于拓展现有项目的一些功能. 拓展方法 扩展方法被定义为静态方法,通过实例方法语法进行调用.方法的 ...

  7. C# 中一些类关系的判定方法 C#中关于增强类功能的几种方式 Asp.Net Core 轻松学-多线程之取消令牌

    1.  IsAssignableFrom实例方法 判断一个类或者接口是否继承自另一个指定的类或者接口. public interface IAnimal { } public interface ID ...

  8. C#反射实现 C# 反射 判断类的延伸类型 使用代码生成工具Database2Sharp快速生成工作流模块控制器和视图代码 C# ADO.NET的SqlDataReader对象,判断是否包含指定字段 页面中添加锚点的几种方式 .net 简单实用Log4net(多个日志配置文件) C# 常用小点

    C#反射实现   一.反射概念: 1.概念: 反射,通俗的讲就是我们在只知道一个对象的内部而不了解内部结构的情况下,通过反射这个技术可以使我们明确这个对象的内部实现. 在.NET中,反射是重要的机制, ...

  9. JavaScript 中实现继承的方式(列举3种在前一章,我们曾经讲解过创建类的最好方式是用构造函数定义属性,用原型定义方法。)

    第一种:对象冒充 function ClassA(sColor) { this.color = sColor; this.sayColor = function () { alert(this.col ...

随机推荐

  1. 搭建zabbix 4.0

    [root@localhost /]# sed ‐i "s#SELINUX=enforcing#SELINUX=disabled#g" /etc/selinux/config #永 ...

  2. Eureka 入门,带视频

    疯狂创客圈 Java 高并发[ 亿级流量聊天室实战]实战系列 [博客园总入口 ] 架构师成长+面试必备之 高并发基础书籍 [Netty Zookeeper Redis 高并发实战 ] 前言 Crazy ...

  3. React Native-ios环境的搭建

    要在mac系统上搭建RN环境: 一.安装Homebrew.它是一款Mac OS平台下的软件包管理工具. 详见Homebrew的安装这篇文章. 二.安装node和watchman,用Homebrew在命 ...

  4. Go学习笔记(持续更中,参考go编程基础,go边看边练)

    使用关键字 var 定义变量,自动初始化为零值.如果提供初始化值,可省略变量类型. 在函数内部,可用更简略的 := 方式定义变量.空白符号_ package main import "fmt ...

  5. C#中try catch中throw ex和throw方式抛出异常有何不同_异常捕获堆栈丢失问题

    前言,最近遇到一个使用try-catch异常捕获后记录一下日志,然后再抛出该异常后,异常堆栈里无法显示准确的堆栈地址的问题?   其实以前也遇到过类似问题,没有重视,这次好好研究了下,并上度娘上找了找 ...

  6. 由“RangeError: Invalid status code: 0”错误所引发的思考

    最近发现一个基于Node.js平台上的Express框架运行的Web网站经常报这样一个错误: RangeError: Invalid status code: 网站的源码中有专门针对错误处理的中间件, ...

  7. Jerome: Vulnhub Walkthrough

    nmap 扫描探测: ╰─ nmap -p1-65535 -sV -A -O -sT 10.10.202.135Starting Nmap 7.70 ( https://nmap.org ) at 2 ...

  8. Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol method: #method<channel.close>(reply-code=406, reply-text=PRECONDITION_FAILED - inequivalent arg 'type' for exchange 'me

    在启动RabbitMQ消费端的时候报错:Caused by: com.rabbitmq.client.ShutdownSignalException: channel error; protocol ...

  9. 关于字符串的格式化----format与%

    格式化字符串一般有两种方法 1.%(d整数,s字符,f浮点数) 2.format 用处极为广泛且限制不多 注意:第一种对于数组的传递会报TypeError,所以必须传递数组 a = (1, 2, 3) ...

  10. linux添加磁盘分区做为swap分区

    在部署oracle时,根据内存的不同,会对swap分区大小有不同要求,具体参考https://www.cnblogs.com/chxmtl/p/11672053.html 下面为具体操作步骤. 1.新 ...