title author date CreateTime categories
C# 如何写出一个不能被其他程序集继承的抽象类
lindexi
2019-08-31 16:55:58 +0800
2019-7-15 12:8:11 +0800
C#

我需要限定某个抽象类只能在我程序集类实现,而不支持其他程序集实现,也就是我需要一个不能被继承的抽象类

在 C# 里面有抽象类和接口,这两个都是期望被继承才能被使用,而抽象类是可以做到只能在自己程序集和程序集可见的其他程序集实现,而在其他的程序集是不能实现

在开始告诉大家如何写之前,需要说明在什么时候需要使用这个方法

有一些接口或方法等需要传入一个抽象的类,但这个抽象类里面有很多方法或属性的定义是和程序集内逻辑相关的,也就是开发者如果直接在外面继承这个抽象类实现出来的一定是不符合预期的。此时就需要用到本文的方法

此时就不能使用接口,因为接口是无法限制只能在程序集内实现,也就是在程序集外依然可以用户自己定义

写出一个只能在程序集内继承的抽象类的方法是在抽象类里面放一个需要被重写的部件,这个部件的访问优先级为程序集内,例如下面的代码,在抽象类 A 里面添加了需要继承重写的 B 方法,而 B 需要用到程序集内才能访问的接口

// 程序集 1
public abstract class A
{
internal abstract IB B();
} internal interface IB
{ }

上面代码的抽象类 A 就只能在程序集 1 中实现,而无法在程序集 2 重写,例如下面代码将会提示重写方法 B 的接口没有权限,而不重写方法 B 就不能继承 A 于是开发者就不能自己实现继承,这样的写法可以让 SDK 开发了多态,但又不让开发者传入不对的值

// 程序集 2
class C : A
{
internal override IB B()
{
return null;
}
}

这样的写法在框架里面有很多,例如 WPF 框架里面的 Brush 画刷就是这样做的,请看 Brush.cs 的实现

在 WPF 里面认为画刷资源是不能给开发者自己写的,因为开发者应该不能了解画刷是如何做的,而在很多类的属性或方法参数都需要传入画刷,因为画刷有纯色画刷等,不能写统一的画刷,于是就通过抽象类,用本文的方法做到让开发者只能用程序集里面定义的画刷。这样可以让框架代码做到支持多个不同的画刷同时让开发者不会随意继承画刷,解决在框架里面大量参数判断

本文用的代码放在github欢迎大家下载

2019-8-31-C#-如何写出一个不能被其他程序集继承的抽象类的更多相关文章

  1. C# 如何写出一个不能被其他程序集继承的抽象类

    我需要限定某个抽象类只能在我程序集类实现,而不支持其他程序集实现,也就是我需要一个不能被继承的抽象类 在 C# 里面有抽象类和接口,这两个都是期望被继承才能被使用,而抽象类是可以做到只能在自己程序集和 ...

  2. 输入一个数字n 如果n为偶数则除以2,若为奇数则加1或者减1,直到n为1,求最少次数 写出一个函数

    题目: 输入一个数字n  如果n为偶数则除以2,若为奇数则加1或者减1,直到n为1,求最少次数  写出一个函数 首先,这道题肯定可以用动态规划来解, n为整数时,n的解为 n/2 的解加1 n为奇数时 ...

  3. java————数组 简单写出一个管理系统

    数组的特点 1,  数组是一块连续的空间,下标描述空间的位置. 2,  下标从0开始,最大下标为数组长度—1.(*.length-1) 3,  数组元素都是变量.(就是每个下标对应的内容).变量的类型 ...

  4. 如何写出一个让人很难发现的bug?

    程序员的日常三件事:写bug.改bug.背锅.连程序员都自我调侃道,为什么每天都在加班?因为我的眼里常含bug. 那么如何写出一个让(坑)人(王)很(之)难(王)发现的bug呢? - 1 -新手开发+ ...

  5. 浅谈如何写出一个让(坑)人(王)很(之)难(王)发现的bug

    该文章内容来自脚本之家,原文链接:https://www.jb51.net/news/598404.html 程序员的日常三件事:写bug.改bug.背锅.连程序员都自我调侃道,为什么每天都在加班?因 ...

  6. 请写出一个超链接,点击链接后可以向zhangsan@d-heaven.com发送电子邮件。

    请写出一个超链接,点击链接后可以向zhangsan@d-heaven.com发送电子邮件. <a href=”mailto: zhangsan@d-heaven.com”>发邮件</ ...

  7. JS函数 编程练习 使用javascript代码写出一个函数:实现传入两个整数后弹出较大的整数。

    编程练习 使用javascript代码写出一个函数:实现传入两个整数后弹出较大的整数. 任务 第一步: 编写代码完成一个函数的定义吧. 第二步: 我们来补充函数体中的控制语句,完成函数功能吧. 提示: ...

  8. 用js写出一个漂亮的单选框选中效果

    一般的input框比较简单,我们可以用JavaScript配合css背景图片定位让我们模拟写出一个点击选中效果 首先需要有个图片素材,当页面加载的时候是背景图片定位到左图,当我们点击图片的时候,背景图 ...

  9. 【C++】从零开始的CS:GO逆向分析3——写出一个透视

    [C++]从零开始的CS:GO逆向分析3--写出一个透视 本篇内容包括: 1. 透视实现的方法介绍 2. 通过进程名获取进程id和进程句柄 3. 通过进程id获取进程中的模块信息(模块大小,模块地址, ...

随机推荐

  1. 2.5 webpack 进阶

    配置分离 code splitting 异步加载 理解 webpack chunk webpack 调试 2.5.1 配置分离 在大型项目中,可能 webpack.config.js 会变得越来越臃肿 ...

  2. CentOS 7 启用中文输入法

    $HOME/.xinitrc LANG="zh_CN.UTF-8" exec startxfce4

  3. Android Telephony分析(六) ---- 接口扩展(实践篇)

    本文将结合前面五篇文章所讲解的知识,综合起来,实现一个接口扩展的功能.如果还没有阅读过前面五篇文章的内容,请先阅读:<Android Telephony分析(一) — Phone详解 >& ...

  4. 在命令行中运行Hadoop自带的WordCount程序

    1.启动所有的线程服务 start-all.sh 记得要查看线程是否启动 jps 2.在根目录创建 wordcount.txt 文件 放置一些数据 3.创建  hdfs dfs -mkdir /文件夹 ...

  5. Hbase时间同步

    如果Hbase的时间没有同步,启动主节点会起来,子节点的regionServer就不会起来. 错误日志如下: aused by: org.apache.hadoop.hbase.ipc.RemoteW ...

  6. 第四记 Java异常

    Java异常结构图 Java所有异常都是从Throwable继承而来,Throwable有两个子类,Error与Exception. Error是错误,对于所有的编译时期的错误以及系统错误都是通过Er ...

  7. 前端 JavaScript BOM & DOM

    内容目录: 1. BOM 2. DOM BOM(Browser Object Model)是指浏览器对象模型,它使 JavaScript 有能力与浏览器进行"对话". DOM (D ...

  8. Ubuntu 常用软件记录【持续更新】

    主机之间通信 Shell 管理器: asbru-cm 文件传输工具: filezilla 虚拟化 Virtual box

  9. sersync/lsyncd实时同步

    第一章 sersync/lsync实时同步 1.1 实时同步服务原理/概念 1)需要部署好rsync守护进程服务,实现数据传输 2)需要部署好inotify服务,实现目录中数据变化监控 3)将rsyn ...

  10. (PASS)什么是原子性和原子性操作?

    什么是原子性操作呢? 下面我举一个例子来说明一下: A想要从自己的帐户中转1000块钱到B的帐户里.那么从A开始转帐,到转帐结束的这一个过程,称之为一个事务.在这个事务里,要做如下操作: 1. 从A的 ...