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

【C#小知识】abstract、virtual、override、sealed关键字

        今天来总结一下abstract、virtual、override、sealed几个关键字。话不多说直接开始。

abstract关键字

        abstract关键字可以来修饰类、方法、属性、索引等。abstract方法在父类中声明,并不需要实现,具体的实现在子类中进行。如下图,在父类中声明了abstract方法AbstractMethod和抽象属性AbstractProperties,然后在子类中进行具体的实现。这里需要注意的是,父类需要用abstract关键字来进行修饰。

abstract class ParentClass
{
    public abstract void AbstractMethod();

    public abstract int AbstractProperties { get; }
}

class ChildClass : ParentClass
{
    public override void AbstractMethod()
    {
        Console.WriteLine("hello world");
    }

    public override int AbstractProperties
    {
        get { return 0; }
    }
}

        abstract的主要作用是强制子类拥有父类的抽象方法并进行覆写,在实际运用中可以用父类类型持有子类实例,例如下面的例子中,List<Animal> animalList列表用父类行存储子类实例,在调用时系统会根据实际类型调用对应方法。

class Program
{
    static void Main(string[] args)
    {
        List<Animal> animalList = new List<Animal>();
        animalList.Add(new Cat());
        animalList.Add(new Dog());

        //输出:喵 喵 喵
        animalList[0].Call();
        //输出:汪 汪 汪
        animalList[1].Call();
    }
}

abstract class Animal
{
    public abstract void Call();
}

class Cat : Animal
{
    public override void Call()
    {
        Console.WriteLine("喵 喵 喵");
    }
}

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

virtual关键字

        virtual关键字可以用来修饰方法、属性等。virtual方法在父类中进行声明,继承的子类可以选择覆写父类方法(也可以选择不覆写)。如下图,父类中声明了virtual方法VirtualMethod,并且子类中也进行了覆写。

class ParentClass
{
    public virtual void VirtualMethod() 
    {
        Console.WriteLine("ParentClass");
    }
}

class ChildClass : ParentClass
{
    public override void VirtualMethod()
    {
        Console.WriteLine("ChildClass");
    }
}

        virtual可以在需要的情况下覆写父类方法,程序运行时会根据对象的实际类型进行方法调用。

如下图所示,List<Animal> animalList储存有Cat和Dog实例,在调用时会别分调用Cat和Dog中的Call方法。

class Program
{
    static void Main(string[] args)
    {
        List<Animal> animalList = new List<Animal>();
        animalList.Add(new Cat());
        animalList.Add(new Dog());

        //输出:喵 喵 喵
        animalList[0].Call();
        //输出:汪 汪 汪
        animalList[1].Call();
    }
}

class Animal
{
    public virtual void Call()
    {
    }
}

class Cat : Animal
{
    public override void Call()
    {
        Console.WriteLine("喵 喵 喵");
    }
}

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

override关键字

        override关键字在子类中使用,用于覆写父类中的abstract、virtual方法。上面的示例代码中已经有过相关使用了,可以看上面的示例。

sealed关键字

        sealed关键字用于修饰类和方法,修饰sealed的类可以防止被其他子类继承,修饰sealed的方法可以防止被子类覆写。

        代码示例如下,Cat类被修饰为sealed,则Cat类无法被继承。Dog类中的Call方法被修饰为sealed方法,则继承Dog类的子类无法覆写Call方法。

class Animal
{
    public virtual void Call()
    {
        Console.WriteLine("动物叫");
    }
}

sealed class Cat : Animal
{
    public override void Call()
    {
        Console.WriteLine("喵 喵 喵");
    }
}

class Dog : Animal
{
    public sealed override void Call()
    {
        Console.WriteLine("汪 汪 汪");
    }
}

官方文档链接

abstract:https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/abstract

virtual:https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/virtual

override:https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/override

sealed:https://learn.microsoft.com/zh-cn/dotnet/csharp/language-reference/keywords/sealed


http://www.kler.cn/a/411186.html

相关文章:

  • 计算机网络的发展
  • HttpServletRequest req和前端的关系,req.getParameter详细解释,req.getParameter和前端的关系
  • 单点修改,区间求和或区间询问最值(线段树)
  • Web3 游戏周报(11.17 - 11.23)
  • nature communications论文 解读
  • 《数据结构》学习系列——图(中)
  • Webpack前端工程化进阶系列(二) —— HMR热模块更新(图文+代码)
  • SpringBoot整合RabbitMQ应用
  • 避坑ffmpeg直接获取视频fps不准确
  • CBK7运营安全
  • C语言学习 12(指针学习1)
  • 图像小波去噪与总变分去噪详解与Python实现
  • C++ 优先算法 —— 无重复字符的最长子串(滑动窗口)
  • 【pyspark学习从入门到精通19】机器学习库_2
  • 第六届国际科技创新学术交流大会暨新能源科学与电力工程国际(NESEE 2024)
  • Scala文件读写——成绩分析
  • 【AI绘画】Midjourney进阶:色调详解(上)
  • pyshark安装使用,ubuntu:20.04
  • QT6学习第四天
  • PAT甲级-1145 Average Search Time
  • C# 结构体
  • C#基础练习61-65
  • MMCM DRP动态配置方法(超详细讲解)
  • Spring Boot 3.4 正式发布,结构化日志!
  • 【Redis篇】String类型命令详讲以及它的使用场景
  • 互联网直播/点播EasyDSS视频推拉流平台视频点播有哪些技术特点?