首页 > 编程语言 >浅谈C# 虚函数和重写

浅谈C# 虚函数和重写

时间:2024-09-02 14:23:18浏览次数:11  
标签:MakeSound Console 浅谈 C# void Animal 重写 public

一、基本介绍

        虚函数(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");
    }
}

标签:MakeSound,Console,浅谈,C#,void,Animal,重写,public
From: https://blog.csdn.net/a876106354/article/details/141818974

相关文章

  • 浅谈C# 委托与事件
    一、基本介绍        委托(Delegate)是一种特殊的类型,它定义了方法的类型,使得可以将方法作为参数传递。事件(Event)是基于委托的一种特殊用途,用于实现事件驱动的编程模型。委托委托可以看作是对方法的一种引用,它允许你将方法作为参数传递给其他方法。委托可以指向任何......
  • I2C通信中,使用FIFO时的读写时序
    在I2C通信中,使用FIFO(First-InFirst-Out)缓冲区可以显著提高数据传输的效率和可靠性。当使用FIFO时,读写时序会有一些特定的要求和优化,以确保数据传输的正确性和高效性。下面详细介绍使用FIFO时的读写时序。读写时序的基本原则在使用I2CFIFO时,读写时序需要考虑以下几个方面:初......
  • CF 2001 D. Longest Max Min Subsequence(*1900) 思维
    CF2001D.LongestMaxMinSubsequence(*1900)思维题目链接题意:给你一个长度为\(n\)的序列\(a\),设\(S\)是\(a\)的所有可能的非空子序列的集合,且没有重复的元素。你的目标是找出\(S\)中最长的序列。如果有多个序列,请找出将奇数位置上的项乘以\(−1\)后,使词序最小......
  • 一个练习项目,好玩的bbs-go-echo
    代码:packagemain/**goenv-wGO111MODULE=ongoenv-wGOPROXY=https://goproxy.cngomodinitgosgomodtidygomodvendor*/import("crypto/md5""database/sql""fmt""log""math"......
  • 一个练习项目,好玩的bbs-go-chi
    代码:packagemain/**goenv-wGO111MODULE=ongoenv-wGOPROXY=https://goproxy.cngomodinitgosgomodtidygomodvendor*/import("crypto/md5""database/sql""encoding/json""fmt""......
  • 模拟信号采集卡设计方案:FMC210-1路1Gsps AD、1路2.5Gsps DA的FMC子卡 信号采集卡
    FMC210-1路1GspsAD、1路2.5GspsDA的FMC子卡  一、板卡概述   FMC-1AD2DA是北京太速科技自主研发的一款1路1GAD采集、1路2.5GDA回放的FMC子卡。板卡采用标准FMC子卡架构,可方便的与其他FMC板卡实现高速互联,可广泛用于高频模拟信号采集、雷达系统测......
  • 一文搞懂lcd偏压问题
    液晶显示器中的“交叉效应”(CrossTalk)是指在某些情况下,液晶显示器的像素之间出现干扰,导致图像显示不准确或失真的现象。交叉效应可能会导致相邻像素的内容泄漏到彼此之间,影响图像的清晰度和对比度。交叉效应通常发生在液晶分子的响应速度较慢或电场分布不均匀的情况下。以下是交......
  • 一个练习项目,好玩的bbs-perl-mojolicious
    代码:#!D:/software/Strawberry/perl/bin/perl.exeBEGIN{push(@INC,'D:/workspace/studys/study_bbs');}useMojolicious::Lite-signatures;useutf8;useNet::MySQL;useEncode;usePOSIX;useJSONqw/encode_jsondecode_json/;useDigest;o......
  • 在 VS Code 中使用 Git 源代码管理【Mac 版】
    目录一、Git使用文档二、使用示例1、复制远程仓库地址2、查看当前所在的分支2.1、界面查看2.2、终端查看3、修改/新增文件4、显示增改的详细内容5、添加暂存区6、查看/取消暂存的更改7、提交本地代码库8、待提交文件9、推送到远程仓库10、验证11、查看推送记录11.1、关于gitlog......
  • NocoBase 与百事通:为法律行业带来全新变革
    关于百事通上海百事通信息技术股份有限公司成立于2006年,是大型创新型法律服务提供方,构建了法律数字化智能平台,为下一代法律解决方案提供创新的技术和服务。百事通业务覆盖全国31省市自治区,积极参与公共法律服务体系建设,年度服务达到700万人次,市占率达50%。在企业法律科......