当前位置: 首页 > news >正文

C# 中的抽象类和抽象方法

目录

抽象类

定义

抽象类的特点

示例

使用场景

抽象方法

定义

抽象方法的特点

示例

使用场景

密闭类

定义

密闭类的特点


在C#编程当中,抽象类和抽象方法是面向对象编程的核心概念,它们用于设计负载的系统,并且在代码中实现高效的抽象和继承

抽象类

定义

抽象类是一种不能被实例化的类,用作其他类的基类。它可以包含抽象方法和普通方法,抽象方法是没有实现的方法,需要在派生类中实现。抽象类通常用来定义一种通用的接口或基础行为,为派生类提供共享的功能和结构。

  • 抽象类的存在只有一个目的,就是被继承。用作其他类的基类。用abstract修饰
  • 抽象类是一种不能被实例化的类,即为不能通过new关键字来创建对象。
  • 抽象类可以包含抽象方法普通方法,以及它们的任意组合
  • 抽象类的抽象成员在派生类当中需要override关键字实现
  • 抽象类通常用来定义一种通用的接口或者基础行为,为派生类提供共享的功能和结构

抽象类的特点

  1. 抽象类不能实例化
  2. 抽象类可以包含字段、属性、方法、构造函数
  3. 可以在抽象类中定义非抽象方法(即具有具体实现的方法),这些方法可以被派生类继承和使用
  4. 抽象类可以包含抽象方法,这些方法没有实现,需要由派生类提供具体实现

示例

using System;abstract class Animal
{public abstract void MakeSound(); // 抽象方法,派生类需要实现public void Sleep() // 普通方法,派生类可以继承和使用{Console.WriteLine("睡觉!");}
}class Dog : Animal
{public override void MakeSound() // 实现抽象方法{Console.WriteLine("狗叫");}
}class Program
{static void Main(){Dog myDog = new Dog();myDog.MakeSound();myDog.Sleep();}
}

使用场景

  • 当需要定义一个基础类,它包含某些通用的功能和结构,但不希望它被直接实例化时。
  • 当需要在多个派生类中共享一些通用实现时。
  • 当有一组派生类共享某些方法和属性时,使用抽象类可以减少代码重复。

抽象方法

定义

抽象方法是没有实现的方法只能存在于抽象类中。抽象方法定义了派生类需要实现的方法签名,但不提供具体的实现。它迫使所有派生类都提供自己对这个方法的实现

抽象方法的特点

  • 抽象方法只能在抽象类中声明。
  • 抽象方法没有方法体,只有方法签名。
  • 派生类必须重写(override)所有抽象方法,除非派生类也是抽象类。
  • 通过抽象方法可以确保派生类遵循相同的接口规范。

示例

using System;abstract class Animal
{public abstract void MakeSound(); // 抽象方法,派生类需要实现public abstract void Eat();      // 新增的抽象方法,派生类也需要实现public void Sleep() // 普通方法,派生类可以继承和使用{Console.WriteLine("睡觉!");}
}class Dog : Animal
{public override void MakeSound() // 实现抽象方法 MakeSound{Console.WriteLine("狗叫");}public override void Eat() // 实现抽象方法 Eat{Console.WriteLine("狗在吃骨头");}
}class Program
{static void Main(){Dog myDog = new Dog();myDog.MakeSound();myDog.Eat();myDog.Sleep(); }
}

使用场景

  • 当需要在派生类中提供特定的实现时,定义抽象方法确保所有派生类都遵循相同的接口规范。
  • 当某些方法在基类中没有实现,但在所有派生类中必须实现时。

密闭类

定义

有时我们可能不希望一个类被其他类继承。在 C# 中,我们可以使用sealed 关键字来实现这一点,创建一个不能被继承的密闭类。

密闭类的特点

  • 当一个类代表一个最终的、不可变的概念时。
  • 当你想要避免类的继承带来的复杂性或潜在的错误时。
  • 当你想要确保类的实现不会被修改或扩展时。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • RK3576 芯片介绍
  • Android笔试面试题AI答之Kotlin(9)
  • Cookie 和本地存储,浏览器缓存
  • 三级_网络技术_18_路由器的配置及使用
  • HCIP-HarmonyOS Application Developer 习题(三)
  • Linux中ES的安装
  • 【信创】双系统下删除Windows只保留麒麟系统
  • Amazon VPC基础指南
  • Docker——常用命令
  • c语言第18天笔记
  • 第11章 第3节 软件测试的基本概念(软件评测师)
  • 水星Mercury X1轮式人形机器人结合openc算法&STag标记码视觉系统实现精确抓取!
  • 轻松学 c++之类与对象下篇 + 模板
  • 流程图绘作方法
  • 【数学建模备赛】Ep02:TOPSIS模型(优劣解距离法)
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • android 一些 utils
  • Angular 4.x 动态创建组件
  • DataBase in Android
  • ECMAScript6(0):ES6简明参考手册
  • Gradle 5.0 正式版发布
  • MQ框架的比较
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 手写一个CommonJS打包工具(一)
  • 微信端页面使用-webkit-box和绝对定位时,元素上移的问题
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • ​configparser --- 配置文件解析器​
  • ​LeetCode解法汇总2696. 删除子串后的字符串最小长度
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • ![CDATA[ ]] 是什么东东
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • #《AI中文版》V3 第 1 章 概述
  • #162 (Div. 2)
  • (1)STL算法之遍历容器
  • (4) openssl rsa/pkey(查看私钥、从私钥中提取公钥、查看公钥)
  • (C语言)strcpy与strcpy详解,与模拟实现
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • .bat批处理出现中文乱码的情况
  • .net core 管理用户机密
  • .net framework profiles /.net framework 配置
  • .net 连接达梦数据库开发环境部署
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET/C# 项目如何优雅地设置条件编译符号?
  • .NET单元测试使用AutoFixture按需填充的方法总结
  • .net获取当前url各种属性(文件名、参数、域名 等)的方法
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • /run/containerd/containerd.sock connect: connection refused
  • @RestControllerAdvice异常统一处理类失效原因
  • []新浪博客如何插入代码(其他博客应该也可以)
  • [AI资讯·0612] AI测试高考物理题,最高准确率100%,OpenAI与苹果合作,将ChatGPT融入系统中,大模型在物理领域应用潜力显现