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

浅谈C# 虚函数和重写

一、基本介绍

        虚函数(Virtual Function)和重写(Override)是面向对象编程中多态性的重要概念。它们允许子类改变继承自父类的行为。

虚函数

虚函数是可以在派生类中被重写的函数。在基类中声明虚函数时,使用关键字 virtual。这样,派生类可以使用 override 关键字来提供新的实现。

虚函数的声明
public class Animal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("Some sound");
    }
}

重写

重写是派生类提供与基类中虚函数具有相同名称和签名的方法的过程。在派生类中重写基类的方法时,使用关键字 override

重写的声明
public class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Bark");
    }
}

抽象类和抽象方法

抽象类是不能被实例化的类,它通常包含一个或多个抽象方法。抽象方法是没有实现的方法,它只有声明,没有方法体,使用 abstract 关键字声明。

抽象类的声明
public class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Bark");
    }
}

密封类和密封方法

有时候,你可能不希望派生类能够重写基类的方法。在这种情况下,可以使用 sealed 关键字来阻止方法被重写。

密封方法的声明
public class Animal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("Some sound");
    }

    public sealed void Eat()
    {
        Console.WriteLine("Eating");
    }
}
尝试重写密封方法
public class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Bark");
    }

    // 下面的代码将导致编译错误,因为 Eat 方法被密封了
    // public override void Eat()
    // {
    //     Console.WriteLine("Eating differently");
    // }
}

使用虚函数和重写的示例

public class Program
{
    public static void Main()
    {
        Animal myAnimal = new Dog();
        myAnimal.MakeSound(); // 输出 "Bark"

        Animal myOtherAnimal = new Animal();
        myOtherAnimal.MakeSound(); // 输出 "Some sound"

        Dog myDog = new Dog();
        myDog.Eat(); // 输出 "Eating",Eat 方法被密封,无法重写
    }
}

public abstract class Animal
{
    public abstract void MakeSound();
    public sealed void Eat()
    {
        Console.WriteLine("Eating");
    }
}

public class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Bark");
    }
}


http://www.kler.cn/news/288624.html

相关文章:

  • html+css+js网页设计 中秋节-作业1个页面
  • 使用 Pandas 进行数据可视化:全面指南(六)
  • 前端框架的演变与选择
  • 【unity实战】使用新版输入系统Input System+Rigidbody实现第三人称人物控制器(附项目源码)
  • Vue window.location详解
  • 【Linux】08.Linux 下的第一个小程序——进度条
  • 分类预测|基于鲸鱼优化WOA最小二乘支持向量机LSSVM的数据分类预测Matlab程序WOA-LSSVM 多特征输入多类别输出
  • Unity 不规则进度条显示
  • 操作系统页面置换: 最近最少使用算法(LRU)
  • Mac基本使用记录
  • 【正点原子K210连载】第三十四章 image图像滤波实验 摘自【正点原子】DNK210使用指南-CanMV版指南
  • 什么是抽象公共代码
  • PLC边缘计算网关的选择策略-天拓四方
  • 0826-0901 各种面试笔试题算法题整理
  • CSS 样式化表格——WEB开发系列24
  • 【数据库|第9期】SQL Server、Access和Sqlite 的字段别名详解
  • 在国产芯片上实现YOLOv5/v8图像AI识别-【4.2】RK3588获取USB摄像头图像推流RTSP更多内容见视频
  • 使用 树莓派3B+ 对日本葡萄园进行经济实惠的环境监测
  • Java 入门指南:Java 并发编程 —— 线程隔离技术 ThreadLocal
  • subclass-balancing的实验结果分析
  • 开放式耳机排行榜10强?这五款绝对不能错过!
  • mysql高可用之组复制 (MGR)
  • 基于RK3568平台移植ffmpeg3.4.5及ffmpeg验证
  • 【战略游戏】
  • Docker笔记-启动容器时,时间与宿主机保持一致
  • 如何找到适合的IT外包服务商
  • 【JAVA】两轮充电桩设计模式实践分享
  • mysql5.7 TIMESTAMP NOT NULL DEFAULT ‘0000-00-00 00:00:00‘ 换版8版本 引发的问题
  • 深入Redis:细谈持久化
  • 浅析前端数据埋点监控:用户行为与性能分析的桥梁