首页 > 编程语言 >C#:具体类=>抽象类=>接口的进化过程详解

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

时间:2024-08-06 14:54:15浏览次数:17  
标签:Run C# void abstract 详解 Vehicle 抽象类 public

文章目录


简单复习继承与多态

下面,我用一个交通工具的例子来快速复习一下.
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类型的抽象类.

标签:Run,C#,void,abstract,详解,Vehicle,抽象类,public
From: https://blog.csdn.net/2301_76886465/article/details/140944989

相关文章

  • Beyond Compare Pro v5.0.0.29773 授权版
    BeyondCompare是一款文件及文件夹(目录)的对比工具。BeyondCompare不仅可以快速比较出两个目录的不同,还可以比较每个文件的内容,而且可以任意显示比较结果。BeyondCompare程序内建了文件浏览器,方便您对文件、文件夹、压缩包、FTP网站之间的差异比对以及资料同步。软件截图:使......
  • C#:深入理解接口及低耦合等周边知识
    接口是完全未实现逻辑的类,纯虚类,只有函数成员,且都为public.换句话说:接口是函数成员全都是abstractpublic类型的抽象类.文章目录接口==契约声明接口接口是引用类型实践价值接口与as运算符显示接口成员实现紧耦合及解决方法解决方法:接口隔离接口==契约定义......
  • C#常用加密解密方法(MD5加密、解密、签名)
    在日常开发过程中,总会遇到需要加密解密的需求,这里我整理了C#常用的加密解密方法分享给大家。先看看加密的基本概念:"加密",是一种限制对网络上传输数据的访问权的技术。原始数据(也称为明文,plaintext)被加密设备(硬件或软件)和密钥加密而产生的经过编码的数据称为密文(ciphertext)......
  • HTML5 WebSocket 详解及使用
    1.WebSocket是什么?WebSocket是HTML5提供的一种在单个TCP连接上进行全双工通讯的协议。(双向通信协议)2.WebSocket的作用?实现客户端与服务器之间的双向通信,允许服务端主动向客户端推送数据。在WebSocketAPI中,浏览器和服务器只需要完成一次握手,两者之间就直......
  • 暑假集训CSP提高模拟14
    暑假集训CSP提高模拟14组题人:@H_Kaguya|@LYinMX\(T1\)P209.BA\(30pts\)部分分\(30pts\):输出\(\left\lceil\dfrac{\sum\limits_{i=1}^{m}a_{i}}{n}\right\rceil\)。数形结合,将\(\{a\}\)抽象成矩形,烙饼抽象成海报覆盖,最终有\(\max(\max\limits_{i=1}^{m}......
  • Mac开发基础08-NSWindow(二)
    NSWindow其他使用和技巧NSWindow是macOS应用程序中用于显示和管理窗口的核心类。可用于创建、编辑和管理应用程序的窗口。1.自定义窗口的内容视图层级替换默认的内容视图NSWindow默认包含一个内容视图,你可以使用自定义内容视图来替换它。Objective-CNSView*customVie......
  • css 实现弹窗缩放出现,从小放大
    在CSS中,实现弹窗从小放大的动画效果,可以使用transform属性和transition属性或者@keyframes动画。以下是几种实现方式:使用transition当弹窗元素的类被添加或移除时,可以使用transition来实现平滑的缩放效果。.modal{opacity:0;transform:scale(0.5);/*初始缩放比例较......
  • python安装torch-cluster、torch-scatter、torch-sparse和torch-geometric | torch_ge
    1.检查CUDA版本【方法1】用nvidia-smi已装cuda,用nvidia-smi或nvcc-V查看【方法2】用torch已装torch,用torch代码打印importtorchprint(torch.__version__)#查看pytorch安装的版本号print(torch.cuda.is_available())#查看cuda是否可......
  • 从零开始学嵌入式技术之C语言11:指针
    一:指针的理解(1)变量的访问方式        内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的 ,为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元通常占用1个字节。变量在内存中分配空间,不同类型的变量占用不同大小的空间,那如何访问内......
  • 【微信小程序实战教程】之微信小程序核心组件详解
    微信小程序核心组件组件化开发并不是小程序所特有的,一些其他编程语言中都有组件化的概念,准确来讲,只有UI视图层的展示,就必定要用到组件化。组件是UI视图层的最基本组成单元,组件中包含了一些基础功能和基础样式,一个组件就类似于一个自定义的标签。小程序框架为开发者提供了......