C#中的屏蔽、覆写和抽象

2023-05-16

屏蔽基类成员

虽然派生类不能删除其继承的任何成员,但可以声明一个与基类成员签名相同的成员来屏蔽之。(注意方法的签名由名称和参数列表组成,不包括返回值类型)

要让编译器知道你在故意屏蔽继承的成员,可使用new操作符,否则会出现警告。

namespace TestConsole
{
    class Human
    {
        public void Action()
        {
            Console.WriteLine("labour...");
        }
    }

    class Student : Human
    {
        new public void Action()
        {
            Console.WriteLine("studing...");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Student stu1 = new Student();
            stu1.Action(); //运行结果为:studing...
            
            Human stu2 = new Student();
            stu2.Action(); //运行结果为:labour...
        }
    }
}

可以看到,如果是用基类类型来创建子类对象,就无法实现屏蔽,除非使用虚方法和覆写方法。

虚方法和覆写方法

虚方法即是基类中被标记为virtual的方法,在派生类中有与之对应的override方法,被称为覆写方法,或重写方法。多态就是基于重写机制的。

namespace TestConsole
{
    class Human
    {
        public virtual void Action()
        {
            Console.WriteLine("labour...");
        }
    }

    class Student : Human
    {
        public override void Action()
        {
            Console.WriteLine("studing...");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Student stu1 = new Student();
            stu1.Action(); //运行结果为:studing...

            Human stu2 = new Student();
            stu2.Action(); //运行结果为:studing...
        }
    }
}

关于virtual和override修饰符有以下注意事项:

  • 虚方法和与之对应的覆写方法必须有相同的可访问性,不能一个public而另一个private。
  • 不能覆写static方法或非虚方法。
  • 方法、属性、索引器、事件,都可以被声明为virtual和override。

抽象类与抽象成员

如果基类中存在这样一个方法,该基类没有实现它的意义,是专门用来给子类实现的,那么我们可以将其声明为抽象成员。

抽象成员是专门用来被覆写的成员,其有以下特征:

  • 必须是一个函数成员,即常量和字段不能声明为抽象成员。
  • 没有实现代码块,抽象成员的实现代码部分仅用一个分号表示。
  • 必须用abstract修饰符标记。
  • 不能是私有成员,可以是public或protected。
  • 只能在抽象类中声明。

抽象成员在C++中被称为纯虚函数,因为相比普通的虚函数,其连实现代码块都没有。相比虚方法,抽象成员必须被覆写,前者覆写是可选的,而后者是必须的。

有4种类型的成员可以声明为抽象成员:方法、属性、事件、索引器。

抽象类则是专门用来被继承的类,抽象类只能被用作其他类的基类,其不能创建实例对象,且要和抽象成员一样,使用abstract声明。抽象类中可以包含抽象成员或非抽象成员,但抽象成员只能存在于抽象类中。

namespace TestConsole
{
    abstract class Animal
    {
        public abstract void Action();
    }
    
    class Human : Animal
    {
        public override void Action()
        {
            Console.WriteLine("labour...");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Human man = new Human();
            man.Action();
        }
    }
}

抽象类与开闭原则

SOLID设计原则中的“开闭原则”:如果不是为了修复bug或增加功能,尽量不要去修改类的代码,特别是函数成员的代码;我们应该封装那些稳定的、确定的、不变的成员,而那些不稳定的、不确定的、随时可能会改变的成员应该声明为抽象成员,留给子类去实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#中的屏蔽、覆写和抽象 的相关文章

  • Linux下切换Python版本的几种方法

    Linux下切换Python版本的几种方法 参考链接 xff1a 1 https www cnblogs com feynxd p 11367806 html 2 https blog csdn net weixin 34355559 ar
  • 基于ip的手机地理定位

    现在lbs服务比较火 xff0c 基本上都需要定位用户的地理信息 xff0c 用户地理信息一般是通过gps来定位实现的 xff0c 那么假如 用户的gps坏了 xff0c 或者没有开启 xff0c 那么怎么获得用户的地理信息的呢 xff1f
  • lm3s811 学习笔记(二)【自己建工程】

    在lm3s811 学习笔记 一 里 xff0c 我讲述了如何使用别人的工程 xff0c 烧写程序到板子上 这一节我来讲讲自己是怎么创建工程 不过用的还是别人的程序 xff0c 毕竟自己对lm3d811驱动库还不熟悉 打开keil 4 1 在
  • 计算机文化基础

    计算机应用基础试题 一 填空题 每空1分 xff0c 共30分 1 计算计的软件系统通常分成 软件和 软件 2 字长是计算机 次能处理的 进制位数 3 1KB 61 B xff1b 1MB 61 KB 4 计算机中 xff0c 中央处理器C
  • 74ls系列中文资料功能介绍

    型号 功能 74ls00 2输入四与非门 74ls01 2输入四与非门 oc 74ls02 2输入四或非门 74ls03 2输入四与非门 oc 74ls04 六倒相器 74ls05 六倒相器 oc 74ls06 六高压输出反相缓冲器 驱动器
  • qt学习笔记(二)之布局管理器&信号与槽(简介)

    我们在上节的程序中加点小应用 主要是用到了布局管理器和信号与槽 在这里我也只是简单介绍一下 随着后续的深入研究 xff0c 接下来会具体介绍 一 布局管理器 include lt QtGui gt int main int argc cha
  • Android 开发之 Activity BroadcastReceiver Service和音乐播放

    Activity的生命周期 xff1a Activity有三个状态 xff1a 当它在屏幕前台时 位于当前任务堆栈的顶部 xff0c 它是激活或运行状态 它就是响应用户操作的Activity 当它失去焦点但仍然对用户可见时 xff0c 它处
  • JSON-lib框架,转换JSON、XML不再困难

    Json lib可以将Java对象转成json格式的字符串 xff0c 也可以将Java对象转换成xml格式的文档 xff0c 同样可以将json字符串转换成Java对象或是将xml字符串转换成Java对象 一 准备工作 1 首先要去官方下
  • xStream完美转换XML、JSON

    xStream框架 xStream可以轻易的将Java对象和xml文档相互转换 xff0c 而且可以修改某个特定的属性和节点名称 xff0c 而且也支持json的转换 xff1b 前面有介绍过json lib这个框架 xff0c 在线博文
  • C++程序员经常问的11个问题

    C 43 43 程序员经常问的11个问题 这篇文章收了好长时间 xff0c 但还是觉得贴出来 xff0c 作为收藏 xff0c 在网上这样的浮躁环境 xff0c 很少能认认真真地看这样长的文章 xff0c 有时间我也要把 Effective
  • C++监控USB设备

    这个程序前阵子帮一个朋友实现的 xff0c 之前从未用消息队列做过类似的事情 xff0c 做完后感觉其在线程同步 xff0c 通信发面很好用 xff0c 难怪COM也用这套机制 程序稍微修改便能用作一般性的处理 xff0c 目前实现的功能类
  • TCP通信

    客户端的代码 xff1a 1 include 34 utili h 34 2 3 int main 4 5 int sockCli 61 socket AF INET SOCK STREAM 0 6 if sockCli 61 61 1 7
  • 解决引用openssl静态库libcrypto.a和libssl.a出现undefined reference to错误的问题

    解决引用openssl静态库libcrypto a和libssl a出现undefined reference to错误的问题 最近在做使用openssl链接http和https的项目 xff0c 编译时出现以下问题 usr local o
  • ssh允许root登录

    vi etc ssh sshd config Authentication LoginGraceTime 120 PermitRootLogin without password 找到这里 xff0c 把它注释 PermitRootLogi
  • 大型网站技术架构

    大型网站技术架构 xff08 1 xff09 网站都是从小网站一步一步发展为大型网站的 xff0c 而这之中的挑战主要来自于庞大的用户 安全环境恶劣 高并发的访问和海量的数据 xff0c 任何简单的业务处理 xff0c 一旦需要处理数以 P
  • iOS线程池

    多线程开发是一件需要特别精心的事情 xff0c 即使是对有多年开发经验的工程师来说 为了能让初级开发工程师也能使用多线程 xff0c 同时还要简化复杂性 各种编程工具提供了各自的办法 对于iOS来说 xff0c 建议在尽可能的情况下避免直接
  • QT https post请求

    以VS开发为例 因为https访问需要用到SSL认证 xff0c 而QT默认是不支持SSL认证 xff0c 所以在使用之前必须先做一些准备工作 xff1a 需要安装OpenSSL库 xff1a 1 首先打开http slproweb com
  • 在windows下的QT编程中的_TCHAR与QString之间的转换

    由于在windows下的QT编程中 xff0c 如果涉及到使用微软的API xff0c 那么不可避免使用 TCHAR这些类型 xff0c 因此在网上查了一下 xff0c 其中一个老外的论坛有人给出了这个转换 xff0c 因此在这里做一下笔记
  • QT图片旋转

    目前发现有两种方法 xff0c 如下 xff1a 1 使用QPixmap的transformed函数旋转 xff0c 这个函数默认是以图片中心为旋转点 xff0c 不能随意设置旋转点 xff0c 使用如下 xff1a QMatrix lef

随机推荐

  • signtool对EXE进行签名

    数字证书 xff0c 真是个神奇的东西 xff0c 可以保证软件不被修改 xff0c 可以表明文件的发布日期 xff0c 最重要的 xff0c 可以很大程度的减少杀毒软件的误报 xff0c 当然 xff0c 这就要使用可信任的机构颁发的证书
  • Linux C语言实现UDP的发送和接收

    发送端实现 xff1a U1 c include lt stdio h gt include lt stdlib h gt include lt string h gt include lt sys socket h gt include
  • C语言 特殊的数字

    问题描述 153是一个非常特殊的数 xff0c 它等于它的每位数字的立方和 xff0c 即153 61 111 43 555 43 333 编程求所有满足这种条件的三位十进制数 span class token macro property
  • STL简单的介绍

    我们要知道C 43 43 的含义 xff1a C语言 43 类 43 模板 xff08 STL就是典型的代表 xff09 STL是Standard Template Library的简称 xff0c 中文名是标准模库 从根本上说 xff0c
  • C语言 查找整数

    问题描述 给出一个包含n个整数的数列 xff0c 问整数a在数列中的第一次出现是第几个 输入格式 第一行包含一个整数n 第二行包含n个非负整数 xff0c 为给定的数列 xff0c 数列中的每个数都不大于10000 第三行包含一个整数a x
  • C语言 字母图形

    问题描述 利用字母可以组成一些美丽的图形 xff0c 下面给出了一个例子 xff1a ABCDEFG BABCDEF CBABCDE DCBABCD EDCBABC 这是一个5行7列的图形 xff0c 请找出这个图形的规律 xff0c 并输
  • C++ 无参构造函数

    设计表示平面坐标位置的点类 xff0c 可以修改和获取点的x y坐标值 xff0c 设置构造函数对点的数据成员进行初始化 xff0c 并且能够用数组保存一系列的点 span class token macro property span c
  • C语言 矩阵乘法

    问题描述 给定一个N阶矩阵A xff0c 输出A的M次幂 xff08 M是非负整数 xff09 例如 xff1a A 61 1 2 3 4 A的2次幂 7 10 15 22 输入格式 第一行是一个正整数N M xff08 1 lt 61 N
  • C语言 分解质因数

    问题描述 求出区间 a b 中所有整数的质因数分解 输入格式 输入两个整数a xff0c b 输出格式 每行输出一个数的分解 xff0c 形如k 61 a1a2a3 a1 lt 61 a2 lt 61 a3 xff0c k也是从小到大的 具
  • 编译原理 赋值语句翻译成四元式

    赋值语句及算数表达式的翻译 将赋值语句翻译成四元式的语义描述 1 S gt id 61 A 2 A gt id 3 A gt int 4 A gt real 5 A gt A1 43 A2 6 A gt A1A2 7 A gt A1 8 A
  • 关联容器知识点通关

    关联容器 1 关联容器与顺序容器的区分2 关联容器的数据2 1 数据存储2 1 1 pair类型2 1 2 关联容器的类型别名2 1 3 关联容器迭代器 2 2 关联容器的初始化 3 关联容器的增删改查3 1 关联容器增加元素3 2 删除关
  • django JWT 验证401错误

    因为前端请求时携带了Authorization请求头 xff08 主要是JWT xff09 xff0c 而如果用户未登录 xff0c 此请求头的JWT无意义 xff08 没有值 xff09 xff0c 为了防止REST framework框
  • “轻松搞定 CMake”系列之 find_package 用法详解

    一 find packakge 命令基本介绍 在我们实际开发过程中 xff0c 经常不可避免会使用到第三方开源库 xff0c 这些开源库可能是通过 apt get install 命令自动安装到系统目录中 xff0c 也可能是由我们自己下载
  • STL中的string类

    一 string是什么 xff1f string类是专门的字符串操作的一个类 xff0c 非常的强大 二 string与char 的区别 xff1a char 呢就是指向字符数组地址的指针 xff0c 然后我们提供了一个string h x
  • Cpp 对象模型探索 / 父类和子类调用构造函数和析构函数的顺序

    2018 03 19 创建人 xff1a Ruo Xiao 邮箱 xff1a xclsoftware 64 163 com 一 建立对象过程 father son 栗子 xff1a span class token keyword clas
  • 串口通信 / 奇校验、偶校验、0 校验和 1 校验

    时间 xff1a 2019 01 28 创建人 xff1a Ruo Xiao 邮箱 xff1a xclsoftware 64 163 com 一 目的 对数据传输的正确与否进行校验 二 方法 奇校验 xff1a 让主体数据加上校验位中的 1
  • 堆栈向下增长和向上增长的理解

    时间 xff1a 2019 01 31 创建人 xff1a Ruo Xiao 邮箱 xff1a xclsoftware 64 163 com 假设堆栈为数组Taskstk unsigned int Taskstk 255 堆栈压数从栈顶压向
  • C++--名字修饰

    名字修饰 在C C 43 43 中 xff0c 一个程序要运行起来 xff0c 需要经历以下几个阶段 xff1a 预处理 编译 汇编 链接 名字修饰 xff08 Name Mangling xff09 是一种在编译过程中 xff0c 将函数
  • 【ROS入门】解决Could not find a package configuration file provided by “nmea_msgs“问题

    笔者Linux虚拟机系统为Ubuntu20 04 xff0c 安装ROS我参考的是https blog csdn net weixin 45168199 article details 106910446 安装完成后创建ROS工作空间 mk
  • C#中的屏蔽、覆写和抽象

    屏蔽基类成员 虽然派生类不能删除其继承的任何成员 xff0c 但可以声明一个与基类成员签名相同的成员来屏蔽之 xff08 注意方法的签名由名称和参数列表组成 xff0c 不包括返回值类型 xff09 要让编译器知道你在故意屏蔽继承的成员 x