严格来说,只有一个类被其他的类继承,那么这个类就是基类。在很多时候,基类的定义是提供足够的抽象和通用方法和属性、默认实现。在继承关系中,基类定义在上层抽象和底层自定义之间。

他们充当抽象实现的实现帮助者,充当框架的部分。例如,处于框架的列表接口 IList 定义。定义一个 IList 在框架中具有重要的作用,可以抽象出具有数组列表的类型,有很多类都继承这个接口,如System.Collections.ObjectModel.Collection:System.Collections.ObjectModel.KeyedCollection 但是这些类都定义了属于自己的存储方法。

基类有时候不适合充当自己的抽象,因为他们存在太多需要定义的内容。例如Collection<T>基类包含了很多具体实现,很多都是在 IList 之外的方法,因为集成的方式由于开放的方式。事实上,他是一个把数据字段里,用字段来存储内容的数组,其他的方法都是对存储字段的封装。

从上面的讨论可以知道,基类对于定义抽象很有帮助,但是在定义的时候,基类需要有自己的职责,因为基类添加了继承深度所以对框架的复杂度会增加。所以定义基类必须基类具有意义。需要避免为了定义相同的类型定义基类,基类的定义需要执行特殊的方法,基类定义需要很清楚。如果提供很多基类,需要让开发者容易找到使用的基类而不是对继承哪个基类需要经过想的时间很长。

✓ 建议设置基类抽象,即使他没有任何抽象的方法或属性。这个定义是任何需要使用这个类定义都需要继承,但是另一个方法是设置这个类的构造是私有。

✓ 把基类和继承类的命名空间分开,这样基类有更大的扩展。

X 建议不要把公开的基类使用 Base 做后缀,如果一个类需要使用这个命名做后缀而无法取让他有意义的命名,那么这个基类可能是违反了上面的原则。

dotnet 设计规范 · 抽象定义的更多相关文章

  1. dotnet 设计规范 · 抽象定义

    严格来说,只有一个类被其他的类继承,那么这个类就是基类.在很多时候,基类的定义是提供足够的抽象和通用方法和属性.默认实现.在继承关系中,基类定义在上层抽象和底层自定义之间. 他们充当抽象实现的实现帮助 ...

  2. dotnet 设计规范 · 数组定义

    本文告诉大家数组定义需要知道的规范,本文翻译 docs dotnet ✓ 建议在公开的 API 使用集合而不是数组.集合可以提供更多的信息. X 不建议设置数组类型的字段为只读.虽然用户不能修改字段, ...

  3. dotnet 设计规范 · 数组定义

    ✓ 建议在公开的 API 使用集合而不是数组.集合可以提供更多的信息. X 不建议设置数组类型的字段为只读.虽然用户不能修改字段,但是可以修改字段里面的元素.如果需要一个只读的集合,建议定义为只读集合 ...

  4. 2018-7-5-dotnet-设计规范-·-抽象定义

    title author date CreateTime categories dotnet 设计规范 · 抽象定义 lindexi 2018-07-05 15:48:20 +0800 2018-2- ...

  5. dotnet 设计规范 · 结构体定义

    X 不要给结构体默认构造函数 默认的C#编译器也不让开发者定义有默认构造的结构体 X 不要定义易变的属性 易变的属性指的是在调用属性返回值的时候返回的是新的实例,易变的属性会有很多的问题. ✓ 需要确 ...

  6. dotnet 设计规范 · 抽象类

    X 不要定义 public 或 protected internal 访问的构造函数.默认 C# 语言不提供抽象类的公开构造函数方法. 如果一个构造函数定义为公开,只有在开发者需要创建这个类的实例的时 ...

  7. dotnet 设计规范 · 抽象类

    X 不要定义 public 或 protected internal 访问的构造函数.默认 C# 语言不提供抽象类的公开构造函数方法. 如果一个构造函数定义为公开,只有在开发者需要创建这个类的实例的时 ...

  8. dotnet 从入门到放弃的 500 篇文章合集

    本文是记录我从入门到放弃写的博客 博客包括 C#.WPF.UWP.dotnet core .git 和 VisualStudio 和一些算法,所有博客使用 docx 保存 下载:dotnet 从入门到 ...

  9. 2018-8-10-dotnet-从入门到放弃的-500-篇文章合集

    title author date CreateTime categories dotnet 从入门到放弃的 500 篇文章合集 lindexi 2018-08-10 19:16:52 +0800 2 ...

随机推荐

  1. ExtJS 布局-Fit布局(Fit Layout)

    更新记录: 2022年5月31日 第一稿. 1.说明 Fit布局只会显示一个子组件,子项组件的尺寸会拉伸到容器的尺寸.当容器进行调整大小(resized),子组件会自动调整去拉伸到付容器的大小. 注意 ...

  2. Centos 创建新的虚拟环境

    1. conda env list 查看目前已经存在的虚拟环境,注意新取的虚拟环境的名字不能和目前已存在的虚拟环境的名字相同! 2. conda create -n [环境名] [指定python版本 ...

  3. 10.Linux防火墙iptables之SNAT与DNAT

    Linux防火墙iptables之SNAT与DNAT 目录 Linux防火墙iptables之SNAT与DNAT SNAT策略及应用 SNAT策略概述 SNAT策略典型应用环境 SNAT策略原理 SN ...

  4. JS:typeof

    想要弄明白某一个变量中保存的数据到底是什么数据类型,我们可以使用到typeof操作符. typeof操作符:检测变量的数据类型. 看例子! var a = "abc"; var b ...

  5. FTP安装及使用

    通过网络传输数据的手段 1. ssh 2. http 3. nfs 4. rsync 5. ftp 6. samba ftp的简介: 1. ftp是应用层协议,是基于TCP 2. 使用21端口 FTP ...

  6. Python爬取某网站文档数据完整教程(附源码)

    基本开发环境 (https://jq.qq.com/?_wv=1027&k=NofUEYzs) Python 3.6 Pycharm 相关模块的使用 (https://jq.qq.com/?_ ...

  7. 记一次重复造轮子(Obsidian 插件设置说明汉化)

    杂谈 #Java脚本 因本人英语不好在使用Obsidian时,一些插件的设置英文多令人头痛.故有写一个的翻译插件介绍和设置脚本的想法.看到有些前人写的一下翻译方法,简直惨目忍睹.竟然要手动.这个应该写 ...

  8. 一张图进阶 RocketMQ - 消息发送

    前 言 三此君看了好几本书,看了很多遍源码整理的 一张图进阶 RocketMQ 图片链接,关于 RocketMQ 你只需要记住这张图!觉得不错的话,记得点赞关注哦. [重要]视频在 B 站同步更新,欢 ...

  9. 记一次 Druid 超时配置的问题 → 引发对 Druid 时间配置项的探究

    开心一刻 一天在路边看到一个街头采访 记者:请问,假如你儿子娶媳妇,给多少彩礼合适呢 大爷:一百万吧,再给一套房,一辆车 大爷沉思一下,继续说到:如果有能力的话再给老丈人配一辆车,毕竟他把女儿养这么大 ...

  10. Vue中关于this指向的问题

    由Vue管理的函数 例如: computed 计算属性 watch 监视属性 filters (Vue3中已弃用且不再支持) 过滤器 .... 上述属性里配置的函数不要采用箭头函数写法,因为箭头函数没 ...