C#学习笔记_继承

基本概念

继承是面向对象程序设计中最重要的概念之一。继承允许我们根据一个类来定义另一个类,这使得创建和维护应用程序变得更容易。同时也有利于重用代码和节省开发时间。

当创建一个类时,程序员不需要完全重新编写新的数据成员和成员函数,只需要设计一个新的类,继承了已有的类的成员即可。这个已有的类被称为的基类,这个新的类被称为派生类。基类有时又叫父类、超类,派生类有时又叫子类。

在逻辑上,可以认为,派生类属于基类,例如,在描述图像时,可以用图形Shape作为基类,正方形Square作为派生类,此时有正方形属于图形的从属关系。

需要注意的是,C#不支持多重继承。意思就是一个派生类只能继承一个基类。当然,基类也可以继承自其它的基类。

继承语法如下:

class BaseClass{//BaseClass基类成员
}
class DerivedClass : BaseClass{//DerivedClass派生类成员
}

一般会在派生类名后添加冒号加基类名,表示派生类继承于基类。

sealed

默认情况下,所有类都可以通过继承得到。但是你可以指定某个类不能作为基类或是指定某个类只能用作基类。例如,指定类A不能作为基类:

public sealed class A {//A类成员
}

此时,我们使用关键字sealed将类限定为密封类,sealed修饰符将阻止其他类继承此类。可以简单理解为,sealed关键字使其他类不能继承于类A。一般称sealed关键字修饰的类为密封类。

abstract

当使用关键字abstract修饰某一类,则该类只能作为基类,不能被实例化。例如,指定类B不能被实例化,类C继承于类B:

public abstract class B{//类B的成员
}
public class C : B{//类C的成员
}

实际上,abstract修饰符表明所修饰内容尚未完全实现。abstract修饰符也可用于函数、属性、索引和事件等,被abstract限定的类成员或包含在abstract类中的成员必须由继承此类的子类实现

例如下面的实例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace K1
{public abstract class Shape //基类Shape表示形状{public abstract int Area(); //获取形状面积,成员函数未完全实现}public class Square : Shape //派生类Square表示正方形{int side;public Square(){side = 0;}public Square(int side){this.side = side;}public override int Area()  //在派生类中成员函数Area实现。{return side * side;}}public class myCaller{public static void Main(string[] args){string side = Console.ReadLine();Square s = new Square(Convert.ToInt32(side));Console.WriteLine("Square Area:" + s.Area());Console.ReadKey();}}
}

需要注意,子类的访问级别不能高于基类,上面的基类Shape与派生类Square均为public访问级别,符合规则。上面实例输入输出如下所示:

>>>10

Square Area:100

代码中,定义的基类Shape以及其中成员函数Area使用abstract修饰,故Shape类必须作为基类,且成员函数Area必须在派生类Square中实现。

abstract类可称为抽象类,抽象类有如下性质:

  • 抽象类不能被实例化;
  • 抽象类可能包含抽象方法和抽象存取器;
  • 抽象类不能被sealed修饰,sealedabstract作用意义互相冲突。使用sealed修饰的类不能被继承,使用abstract修饰的类只能被继承;
  • 继承自抽象类的子类必须实现抽象类中声明的抽象函数和抽象存取器。

在函数或属性声明处使用abstract修饰符,用来表明该函数或属性不可实现。abst\fract修饰的函数有如下几个特点:

  • 抽象方法声明只允许在抽象类中使用;
  • 由于抽象方法没有提供具体的实现过程,所以不需包含函数体;方法声明以;结尾,不需使用{};具体的实现过程将会在子类中,使用override标志;
  • 在抽象方法声明中不允许使用staticvirtual
  • 抽象方法是一种隐式的虚函数virtual method。 

抽象属性表现类似于抽象方法,除了声明和调用语法的不同之外:

  • 在静态(static修饰)属性中不可使用abstract修饰符;
  • 在基类中声明的抽象属性可继承到子类中。并使用override重写。

override

上面的实例,在派生类Square中的成员函数Area中,涉及到另外一个关键字overrideoverride修饰符用来拓展或修改继承自基类中的方法、属性、索引或事件,其中基类中的方法、属性、索引或事件使用abstractvirtual修饰。

其中,override重写实现的方法声明必须与基类中方法拥有相同的函数签名。

override不能重写非虚方法或静态方法,抽象方法是一种隐式的虚方法,在基类中的方法必须使用virtualabstractoverride修饰。

使用override修饰方法声明不能更改继承基类虚方法的访问修饰符,两者需保持一致。

在使用override修饰的方法时不能够使用修饰符newstaticvirtual。使用override修饰的属性类似。

多态

多态可理解为多种形态,在派生于同一个类的不同子类对象上执行任务操作时,多态性十分的高效,使用的代码最少。只要在继承层次中有一个相同多的类,那么就可使用多态性进行处理。

下面的代码实例可体现多态使用:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace K2
{public abstract class Shape //基类Shape{public abstract int Area(); //获取形状面积}//派生类圆形Circular类和正方形Square类public class Circular : Shape{int radius; //成员radius表示圆形半径public Circular(int radius){this.radius = radius;}public override int Area()  //重写基类成员函数{return radius * radius * 3;}public void radiusSet(int radius){this.radius = radius;}}public class Square : Shape{int side;   //成员side表示正方形边长public Square(int side){this.side = side;}public override int Area(){return side * side;}}public class myCaller{public static void Main(string[] args){Circular c = new Circular(4);Square s = new Square(4);Shape shape1 = s;   //子类对象可被当做基类对象使用Shape shape2 = c;Console.WriteLine("Square Area:" + shape1.Area());  //多个子类便可提供多种Area实现Console.WriteLine("Circular Area:" + shape2.Area());}}
}

多态有多种应用场景:

一、子类对象可被当做基类对象使用

在运行时,子类对象可被当做基类对象使用,例如当对象用于方法参数、集合或数组的时候,该对象的声明类型不再与运行时类型相同。例如上面的实例中,Shape类对象接受Circular类对象、Square类对象无需强制类型转换。此时对象shape2不能使用Circular类中的成员函数RadiusSet,如果想要调用,可以使用强制类型转换将Shape类对象转换回Circular类对象。

Circular c2=(Circular)shape2;
c2.RadiusSet(10);

二、子类可提供多种基类方法实现

使用继承的时候,子类可使用override重写基类中定义和实现的虚方法,多个子类便可提供多种实现。在运行时,当客户端代码调用该方法的时,CLR查询对象的运行时类型,会调用重写的虚方法。所以,源码中可通过调用基类中的方法,具体执行的则是子类中已重写的方法。

例如上面的实例,子类便使用override重写了基类中定义的Area方法,此后Shape类对象分别接受s、c,调用Area方法时,Shape1使用的是Square类中实现的方法,Shape2使用的是Circular类实现的方法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/664208.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI监控+智能充电桩系统如何缓解新能源汽车充电难问题

在新能源汽车行业的快速发展中,充电桩作为重要的配套设施,其建设和发展至关重要。随着新能源汽车销量的增长,补能需求也日益迫切,这为充电桩行业的发展提供了巨大的机遇。然而,充电桩行业在快速发展的同时,…

MavenGradle等引入jSerialComm

引入 jSerialComm [2.0.0,3.0.0) 此版本发布于 Nov 7, 2023 (23年11月) Maven: <dependency><groupId>com.fazecast</groupId><artifactId>jSerialComm</artifactId><version>[2.0.0,3.0.0)</version> </dependency>Ivy: …

[云顶数模]2024美赛CEF题成品参考论文+配套数据集+可执行代码+运行结果图

E题社区抗灾能力综合评估与决策模型研究 摘要&#xff1a;社区抗灾能力的提升对于灾害风险管理至关重要。本研究基于机器学 习方法&#xff0c;构建了社区抗灾能力预测模型&#xff0c;以评估社区在灾害事件中的表现。首先&#xff0c; 我们采用梯度提升树模型对社区基础设施、…

Prometheus 采集Oracle监控数据

前言 oracledb_exporter是一个开源的Prometheus Exporter,用于从Oracle数据库中收集关键指标并将其暴露给Prometheus进行监控和告警。它可以将Oracle数据库的性能指标转换为Prometheus所需的格式,并提供一些默认的查询和指标。 download Oracle Oracle Windows Install …

C++面试:事务的隔离级别和实践原理

目录 1. 读未提交&#xff08;Read Uncommitted&#xff09; 定义 问题 场景 实践注意事项 MySQL SQL Server PostgreSQL 注意 2. 读提交&#xff08;Read Committed&#xff09; 定义 问题 场景 如何操作 MySQL SQL Server PostgreSQL 注意事项 3. 可重复读…

【Docker】网络配置network详解

一&#xff0c;network的概述 解决痛点&#xff08;能干什么&#xff1f;&#xff09;&#xff1a; &#xff08;1&#xff09;容器间的互联和通信以及端口映射 &#xff08;2&#xff09;容器IP变动时候&#xff0c;可以通过服务名直接网络通信而不受到影响 二&#xff0c;n…

webrtc mediasoup sctp 起什么作用? 用来传输什么数据

WebRTC是一种用于实时通信的开放标准&#xff0c;而mediasoup是一个基于WebRTC的流媒体服务器。SCTP&#xff08;Stream Control Transmission Protocol&#xff09;是WebRTC中的一个传输协议&#xff0c;它在WebRTC中起到了重要的作用。 SCTP主要用于在WebRTC中传输数据通道&…

功率信号的频谱

目录 1. 前言2. 功率信号的频谱3. 参考资料 1. 前言 知识点1&#xff1a;函数周期性判定定理   假设函数 f ( x ) f(x) f(x) 和函数 g ( x ) g(x) g(x) 均为周期性函数&#xff0c;其最小正周期分别为 T f T_f Tf​ 和 T g T_g Tg​&#xff0c;若 T f / T g T_f/T_g T…

搜索引擎评价指标及指标间的关系

目录 二分类模型的评价指标准确率(Accuracy,ACC)精确率(Precision,P)——预测为正的样本召回率(Recall,R)——正样本注意事项 P和R的关系——成反比F值F1值F值和F1值的关系 ROC&#xff08;Receiver Operating Characteristic&#xff09;——衡量分类器性能的工具AUC&#xff…

2月2日作业 C语言笔试题整理

1、请简述gcc的编译步骤 预处理&#xff1a;展开头文件、删除注释、替换宏 编译&#xff1a;检查语法正确性&#xff0c;生成汇编文件 汇编&#xff1a;把汇编语言转换为二进制文件&#xff0c;生成目标文件 链接&#xff1a;把多个目标文件链接为可执行文件 2、C语言中基…

基于Java SSM框架实现校园兼职系统项目【项目源码+论文说明】

基于java的SSM框架实现校园兼职系统演示 摘要 社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。网络计算机的生活方式逐渐受到广大人民群众的喜爱&#xff0c;也逐渐进入了每个学生的使用。互联网具有便利性&#xff0c;速度快&#xff0c;效率高&#xff0c;…

买电脑注意事项之CPU型号后面的字母都代表什么意思

在 CPU 型号后面的字母通常表示该 CPU 的一些特性或用途。不同的字母可能代表不同的系列、性能级别、功耗特性等。以下是一些常见的 CPU 后缀字母及其可能的含义&#xff1a; U&#xff08;例如&#xff1a;i5-8250U&#xff09;: Ultra Low Power&#xff1a;表示低功耗&#…

Elasticsearch(简称ES)性能优化 实践

Elasticsearch&#xff08;简称ES&#xff09;性能优化主要包括以下几个方面&#xff1a; 索引优化&#xff1a; 选择合适的分片数&#xff1a;根据业务需求和数据量合理设置分片数&#xff0c;避免过多或过少分片造成性能问题。分片数过多会导致创建分片速度变慢、集群易崩溃…

[office] excel计算客户名单的人数 COUNTA 函数:“销售额”不仅是金额的总和 #知识分享#职场发展#知识分享

excel计算客户名单的人数 COUNTA 函数&#xff1a;“销售额”不仅是金额的总和 前文中介绍的 SUM 函数&#xff0c;是在日常工作中使用频率最高的函数之一。但是&#xff0c;在实际操作时也会出现问题。比如在计算销售额总和时&#xff0c;SUM 函数得出的结果为金额总和。但是…

RISC-V指令格式

RISC-V指令格式 1 RISC-V指令集命名规范2 RISC-V指令集组成2.1 基础整数指令集2.2 扩展指令集 3 RISC-V指令格式3.1 指令表述3.2 指令格式 本文属于《 RISC-V指令集基础系列教程》之一&#xff0c;欢迎查看其它文章。 1 RISC-V指令集命名规范 前面提到过RV32I&#xff0c;这是…

本地部署 SalesGPT

本地部署 SalesGPT 0. 背景1. SalesGPT 项目介绍2. SalesGPT 项目 Github 地址3. 本地部署 SalesGPT4. 运行 SalesGPT 0. 背景 最近有同事想玩玩 SalesGPT&#xff0c;结果发现使用 OpenAI API 时&#xff0c;会发生超过 Limit 的问题无法继续对话。 今天尝试通过本地部署开源…

5. 基础网络服务与应用配置

5.1 实验一&#xff1a;FTP 基础配置实验 5.1.1 实验介绍 5.1.1.1 关于本实验 设备支持多种文件管理方式&#xff0c;用户根据任务和安全性要求选择合适的文件管理方式。 用户可以通过直接登录系统、FTP&#xff08;File Transfer Protocol&#xff09;、TFTP&#xff08;T…

从编程中理解:大脑的短期记忆和长期记忆

在编程中,我们可以将大脑的短期记忆和长期记忆类比为程序中的变量作用域和持久化存储。在Unity C#编程环境下,可以这样解释: 假设金庸武侠世界中的人物张无忌正在修炼九阳真经。我们用C#代码来模拟他学习武功的过程,其中涉及的“短期记忆”与“长期记忆”。 public class…

第8章 SpringBoot任务管理

学习目标 熟悉SpringBoot整合异步任务的实现 熟悉SpringBoot整合定时任务的实现 熟悉SpringBoot整合邮件任务的实现 开发web应用时,多数应用都具备任务调度功能。常见的任务包括异步任务,定时任务和发邮件任务。我们以数据库报表为例看看任务调度如何帮助改善系统设计。报表可…

【深度学习】数据归一化/标准化 Normalization/Standardization

目录 一、实际问题 二、归一化 Normalization 三、归一化的类型 1. Min-max normalization (Rescaling) 2. Mean normalization 3.Z-score normalization (Standardization) 4.非线性归一化 4-1 对数归一化 4-2 反正切函数归一化 4-3 小数定标标准化&#xff08;Demi…