dotnet 设计规范 · 抽象类

X 不要定义 public 或 protected internal 访问的构造函数。默认 C# 语言不提供抽象类的公开构造函数方法。

如果一个构造函数定义为公开,只有在开发者需要创建这个类的实例的时候才可以这样做。因为开发者不应该创建一个抽象类的实例,所以如果一个抽象类可以创建实例就是一个不好的实现,容易让开发者做出不恰当代码。

✓ 定义抽象类的构造函数为 protected 或 internal 访问

定义抽象类的构造函数为 protected 是比较推荐的方法,因为定义为 protected 让这个类只能在基类继承,创建可实例化的基类的实例。

定义抽象类的构造函数为 internal 可以限制开发者只能在只是程序集内使用这个类,当然即使定义为 internal 还是无法创建抽象类的实例。

✓ 提供至少一个可实例化类继承抽象类在自己的库里。

做这个是为了方便验证抽象类的设计。如 System.IO.FileStream 继承抽象类 System.IO.Stream 而且 FileStream 可以创建实例。

当然这个只是建议,如果在开发一个 dotnet standard 项目,需要注入一个和具体框架有关的类,于是先设计一个抽象类放在库。在具体的 dotnet framework 等框架创建这个抽象类的基类,用于做和具体平台相关代码。那么不在库放一个实现抽象类的类也是可以的。但是这时建议在测试项目继承这个抽象类,尝试测试类的设计。

参见:docs/abstract-class.md at master · dotnet/docs


本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏mukekeheart的iOS之旅

《JavaScript高级程序设计》学习笔记(3)——变量、作用域和内存问题

欢迎关注本人的微信公众号“前端小填填”,专注前端技术的基础和项目开发的学习。 本节内容对应《JavaScript高级程序设计》的第四章内容。 1、函数:通过函数...

2906
来自专栏运维技术迷

Python时间与时间戳转换

python的datetime转换为UNIX时间戳 #导入time模块(用于转换时间戳) In [1]: import time   # 导入datetime模...

3745
来自专栏阿凯的Excel

Python读书笔记24(类修改属性)

上期和大家分享了类的用法,本期和大家分享的内容是如何修改类的属性! 我们继续用人这个类进行分享! 但是本次我们给人增加一个年龄属性!并且默认一个人出生的时候是0...

2927
来自专栏散尽浮华

python-基础案例

范例一: 练习:元素分类 有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,...

2505
来自专栏跟着阿笨一起玩NET

C#修饰符

C#中类及类型成员权限访问修饰符有以下四类:public,private,protected,internal。

1222
来自专栏余林丰

初识Java反射

要详细的了解Java反射,就得要了解Java的类加载以及何为运行时动态加载等等概念。本文抛开其余概念,简单介绍Java反射,详细介绍会在以后有一个系统而全面的认...

25410
来自专栏搞前端的李蚊子

使用箭头函数的几个注意事项

刚才写一个需要递归操作的函数,在使用arguments.callee的时候,报错undefined,因为arguments.callee在严格模式下会失效,以为...

3776
来自专栏北京马哥教育

百度大牛总结十条Python面试题陷阱,看看你是否会中招

2327
来自专栏专注 Java 基础分享

Java并发之synchronized关键字

     上篇文章我们主要介绍了并发的基本思想以及线程的基本知识,通过多线程我们可以实现对计算机资源的充分利用,但是在最后我们也说明了多线程给程序带来的两种典型...

2015
来自专栏cs

c++那些事儿6.0 STL中的string

---- 知识点综述 c++,string 类 string 是C++中的字符串对象,是一种特殊类型的容器,专门设计来操作的字符序列。 ...

2917

扫码关注云+社区

领取腾讯云代金券