dotnet 设计规范 · 抽象类
X 不要定义 public 或 protected internal 访问的构造函数。默认 C# 语言不提供抽象类的公开构造函数方法。
如果一个构造函数定义为公开,只有在开发者需要创建这个类的实例的时候才可以这样做。因为开发者不应该创建一个抽象类的实例,所以如果一个抽象类可以创建实例就是一个不好的实现,容易让开发者做出不恰当代码。
✓ 定义抽象类的构造函数为 protected 或 internal 访问
定义抽象类的构造函数为 protected 是比较推荐的方法,因为定义为 protected 让这个类只能在基类继承,创建可实例化的基类的实例。
定义抽象类的构造函数为 internal 可以限制开发者只能在只是程序集内使用这个类,当然即使定义为 internal 还是无法创建抽象类的实例。
✓ 提供至少一个可实例化类继承抽象类在自己的库里。
做这个是为了方便验证抽象类的设计。如 System.IO.FileStream 继承抽象类 System.IO.Stream 而且 FileStream 可以创建实例。
当然这个只是建议,如果在开发一个 dotnet standard 项目,需要注入一个和具体框架有关的类,于是先设计一个抽象类放在库。在具体的 dotnet framework 等框架创建这个抽象类的基类,用于做和具体平台相关代码。那么不在库放一个实现抽象类的类也是可以的。但是这时建议在测试项目继承这个抽象类,尝试测试类的设计。
dotnet 设计规范 · 抽象类的更多相关文章
- dotnet 设计规范 · 抽象类
X 不要定义 public 或 protected internal 访问的构造函数.默认 C# 语言不提供抽象类的公开构造函数方法. 如果一个构造函数定义为公开,只有在开发者需要创建这个类的实例的时 ...
- dotnet 设计规范 · 抽象定义
严格来说,只有一个类被其他的类继承,那么这个类就是基类.在很多时候,基类的定义是提供足够的抽象和通用方法和属性.默认实现.在继承关系中,基类定义在上层抽象和底层自定义之间. 他们充当抽象实现的实现帮助 ...
- dotnet 设计规范 · 结构体定义
X 不要给结构体默认构造函数 默认的C#编译器也不让开发者定义有默认构造的结构体 X 不要定义易变的属性 易变的属性指的是在调用属性返回值的时候返回的是新的实例,易变的属性会有很多的问题. ✓ 需要确 ...
- dotnet 设计规范 · 数组定义
本文告诉大家数组定义需要知道的规范,本文翻译 docs dotnet ✓ 建议在公开的 API 使用集合而不是数组.集合可以提供更多的信息. X 不建议设置数组类型的字段为只读.虽然用户不能修改字段, ...
- dotnet 设计规范 · 抽象定义
严格来说,只有一个类被其他的类继承,那么这个类就是基类.在很多时候,基类的定义是提供足够的抽象和通用方法和属性.默认实现.在继承关系中,基类定义在上层抽象和底层自定义之间. 他们充当抽象实现的实现帮助 ...
- dotnet 设计规范 · 数组定义
✓ 建议在公开的 API 使用集合而不是数组.集合可以提供更多的信息. X 不建议设置数组类型的字段为只读.虽然用户不能修改字段,但是可以修改字段里面的元素.如果需要一个只读的集合,建议定义为只读集合 ...
- dotnet 从入门到放弃的 500 篇文章合集
本文是记录我从入门到放弃写的博客 博客包括 C#.WPF.UWP.dotnet core .git 和 VisualStudio 和一些算法,所有博客使用 docx 保存 下载:dotnet 从入门到 ...
- 2018-8-10-dotnet-从入门到放弃的-500-篇文章合集
title author date CreateTime categories dotnet 从入门到放弃的 500 篇文章合集 lindexi 2018-08-10 19:16:52 +0800 2 ...
- 2018-3-4-dotnet-设计规范-·-结构体定义
title author date CreateTime categories dotnet 设计规范 · 结构体定义 lindexi 2018-03-04 17:48:44 +0800 2018-2 ...
随机推荐
- 端口被占用的问题解决 Web server failed to start. Port ×× was already in use
出现此问题是端口被占用了,只需要关闭正在使用的端口就行 解决思路: 1.在服务器中更改port端口号,改为不冲突,没有被占用的端口. 2.找出被占用的端口,结束被占用的端口 解决结束被占用的端口的方法 ...
- java基础知识点梳理
前言 在别人追问我以下几个问题,自己在问题回答上不够全面和准确,对此自己把专门针对这几个问题进行总结! java相关问题 1.Java中构造方法跟普通方法的区别? 构造方法与普通方法的调用时机不同. ...
- Halcon 条形码识别
read_image (Image, 'C:/Users/HJ/Desktop/test_image/image.png') create_bar_code_model([], [], BarCode ...
- P2575 高手过招 题解
题目描述 我们考虑如何把问题转换成博弈论来求解. 我们对于每一行之前都加上一个空格. 设原来这一行的空格个数是 \(C\) ,那么此时空格个数变成 \(C + 1\) . 然后按照从左到右的顺序给每一 ...
- 2019 CSP-J 初赛解析
题面,成绩不是真实水平,就挑重点说一说 老师给的解析 T5 这是二分查找,属于是我的代码理解不太对 我的理解 #include<iostream> using namespace std; ...
- Linux综合运用
一. Linux用户和组及其权限管理 请根据以下项目要求,写出操作过程和命令并进行相应的验证测试操作. 项目要求: 某软件开发公司即将开始在Linux系统上进行项目的开发.要实现的环境是:公司有软件开 ...
- 基于ABP实现DDD--仓储实践
由于软件系统中可能有着不同的数据库,不同的ORM,仓储思想的本质是解耦它们.在ABP中具体的实现仓储接口定义在领域层,实现在基础设施层.仓储接口被领域层(比如领域服务)和应用层用来访问数据库,操作 ...
- fpga中的存储器
fpga中的存储器三种:RAM,ROM,FIFO. RAM和ROM已经比较熟悉了,记录一下FIFO. FIFO:first in first out ,顺序存取,先入先出.是一种数据缓存器,用来作不同 ...
- Redis_
Redis学习 Redis学习(一) 1. NoSQL的引言 NoSQL(Not Only SQL ),意即不仅仅是SQL, 泛指非关系型的数据库.Nosql这个技术门类,早期就有人提出,发展至200 ...
- GCD Compression
题目大意: 有一个数组 a 其中有 2n 个数,把它压缩进数组 b,b 的大小是 n-1. 所谓的"压缩"指的是两种操作: 首先舍弃 a 当中的两个数(你可以任意选择). 然后每次 ...