C#:具体类=>抽象类=>接口的变化过程详解

ops/2024/10/18 14:21:05/

文章目录

  • 简单复习继承与多态
  • 具体类
  • 抽象类及成员
    • 使用
    • 语法
  • 接口
    • 抽象类到接口的进化


简单复习继承与多态

下面,我用一个交通工具的例子来快速复习一下.
1.首先我定义一个基类Vehicle,代表交通工具的总称.里面定义了一个可被重写的成员方法Run.

    class Vehicle{public virtual void Run(){Console.WriteLine("Vehicle is running");}}

2.定义两个派生类继承Vehicle这个基类,然后用override进行重写,覆盖掉之前的基类.

    class Car : Vehicle{public override void Run(){Console.WriteLine("Car is running");}}class Truck : Vehicle{public override void Run(){Console.WriteLine("Truck is running");}}

Main方法:

    class Program{static void Main(string[] args){Vehicle vehicle = new Vehicle();Car car = new Car();Truck truck = new Truck();  //定义三个对象vehicle.Run();car.Run();truck.Run();}}

实验结果
在这里插入图片描述
通过上面的代码和结果可以知道,Run方法继承到派生类Car,被我们重写之后,调用Run所运行的就是Car is running. override重写的方法将virtual方法覆盖.
我们如果想继承Car这个类并对他的Run进行重写的话,也是一样,用override进行重写.

    class RaceCar:Vehicle{public override void Run(){Console.WriteLine("RaceCar is running");}}

具体类

上面我们所创建的就是具体类,每个方法都有实现.

    class Vehicle{public virtual void Run(){Console.WriteLine("Vehicle is running");}}

那么问题来了,我们在日常生活中,总不会说出交通工具在跑吧?基类的这个Run的实现显得没有那么必要,只会增加我们的工作量.
没错,问题的解决方法就是抽象类

抽象类及成员

使用

    abstract class Vehicle{public abstract void Run();}class Car : Vehicle{public override void Run(){Console.WriteLine("Car is running");}}

把基类的Run方法的代码块去掉,然后在方法体和类前面加个abstract关键字.声明这是一个抽象类.
其他不需要修改

语法

1.何为抽象?就是不具体.所以我们不可以抽象具体的数据成员和字段
在这里插入图片描述
2.抽象类不能被实例化.(不具体的东西怎么能被实际表示出来呢?)
在这里插入图片描述
3.因为抽象类不能被实例化,所以抽象类天生就是要被继承的.抽象类因为类里面有抽象方法不能被实例化.所以派生类在继承抽象类时必须把抽象类欠下的债还回去.(把抽象成员表示具体)
在这里插入图片描述
派生类Car在继承Vehicle时,把所有的抽象成员都用override重写了.所以编译通过.
而truck没有把抽象成员全部重写,编译失败

由上面的代码我们也可以看出,派生类要实现抽象类的抽象成员必须用override重写.

那么问题又来了,这种实现了一部分的抽象类是什么?
在这里插入图片描述
这种实现了一半的派生类自己也是抽象类. (毕竟还欠着债呢)

4.抽象类可以包含抽象成员和具体成员

    abstract class Vehicle{public int size = 10; //具体成员public abstract int Speed{ get; set; }public abstract void Run();}

总结:abstract 抽象类 :为复用而生,不能实例化,专门作为基类,未完全实现逻辑的类(方法没实现全)

接口

抽象类到接口的进化

abstract class VehicleBase
{abstract public void Stop();abstract public void Run();
}

这是一个抽象类,里面声明两个抽象方法,Run与Stop.
问题来了,难道不觉得重复写abstract public 让代码显得很臃肿吗?
所以,接口来了.

interface IVehicleBase
{void Stop();void Run();
}

把abstract public都去掉,抽象类名前面的关键字换成interface接口.
我们来给接口下一个定义:接口是完全未实现逻辑的类,纯虚类,只有函数成员,且都为public
换句话说:接口是函数成员全都是abstract public类型的抽象类.


http://www.ppmy.cn/ops/90368.html

相关文章

Python爬虫技术 第31节 持续集成和自动化部署

持续集成和自动化部署 Git版本控制 Git 是一个非常流行的分布式版本控制系统,用于跟踪对项目文件的修改。对于爬虫项目来说,使用Git可以帮助你管理代码的不同版本,协同开发,并且可以在出现问题时回滚到之前的版本。 基本操作&a…

KubeVirt虚拟机存储及网络卸载加速解决方案

1. 方案背景 1.1. KubeVirt介绍 随着云计算和容器技术的飞速发展,Kubernetes已成为业界公认的容器编排标准,为用户提供了强大、灵活且可扩展的平台来部署和管理各类应用。然而,在企业的实际应用中,仍有许多传统应用或遗留系统难…

自学黑客(网络安全)

前言: 想自学网络安全(黑客技术)首先你得了解什么是网络安全!什么是黑客! 网络安全可以基于攻击和防御视角来分类,我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术,而“蓝队”、“…

321.拼接最大数(xx笔试变体拼接最小数)

前言 昨天做人生中第一场找工作笔试题碰到了这道题的变体拼接最小数,是编程题的最后一道,苦思冥想没做出来,结束后去搜发现了力扣上有拼接最大数这道题(变体题在这个基础上变难了,其中某个数组可能为空同时还得考虑0不…

SQL布尔盲注

目录 1 布尔盲注 2布尔盲注流程 2.1输入id进行测试 2.2判断注入类型 2.3爆数据库名 2.4爆表名 2.5爆字段名 2.6查询数据 1 布尔盲注 布尔盲注就是在SQL注入过程中,SQL语句执行后,查询到的数据不能回显到前端页面,如果正确执行了构造的…

Visual Studio 的介绍和详解

Visual Studio是微软公司推出的一款功能强大的开发工具包系列产品,它提供了一个基本完整的开发工具集,为软件开发者提供了整个软件生命周期中所需的大部分工具。以下是对Visual Studio的详细介绍和详解: 一、Visual Studio的基本介绍 定义与…

【web3.0】Web3 开发教程与代码资源:探索如何在Web3项目中开发应用

引言 Web3,作为区块链技术和互联网融合的产物,正逐步重塑我们对数字世界的理解与交互方式。它不仅仅是一个技术概念,更是一个去中心化、用户主权的网络愿景,旨在通过智能合约、去信任的交易和加密货币等技术手段,为用…

windows下在线预览服务kkFileView4.4.0问题记录

前几天找到一个开源项目:kkFileView,感觉可能以后可能会用到,所以尝试了下。 通过git下载下来,版本是4.4.0,通过idea打开项目,发现老是无法找到组件aspose-cad,版本是23.9. 找了好多文章&#x…