C#中虚函数和抽象函数的概念

1)虚函数 virtual

virtual用于在基类中修饰方法,允许在派生类中使用override关键字重写方法

默认情况下,方法是非虚拟的。 不能替代非虚方法。v

irtual 修饰符不能与 static、abstract、private 或 override 修饰符一起使用。

virtual 方法有方法体,只是要求在派生类中进行override选择性重写操作。

2)抽象方法 abstract

抽象方法是在基类中声明,但没有提供具体的实现,而是在派生类中实现。它们用于强制派生类提供特定的方法实现。

抽象类中有抽象方法,也可以没有抽象方法,抽象方法只存在于抽象类中,不存在于普通类中

抽象类不能被实例化,作为基类,派生类的模版,抽象类中可以包含抽象方法和非抽象方法。

抽象方法abstract和virtual虚方法的区别

1)虚方法必须有实现部分,抽象方法不可以有实现部分

2)虚方法可以在派生类中重写,也可以不重写,抽象方法必须在派生类中重写。

3)虚方法可以在任何非密封类中身影,抽象方法只能在抽象类中进行声明

4)如果类包含抽象方法,则该类必须为抽象类,不能被实例化

虚方法倾向于代码复用,抽象方法约束子类必须实现某方法

虚方法的使用例子

cs 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace VirtualMethod01
{
    //虚方法的示例
    //virtual方法
    public class BaseClass
    {
        public virtual void Display()//基类中的虚方法
        {
            Console.WriteLine("BaseClass Display");
        }
    }
    public class DerivedClass : BaseClass//派生类从基类中继承
    {
        public override void Display() //override重写基类中的虚方法
        {
            Console.WriteLine("DerivedClass Dispaly");
        }
    }
    internal class Program
    {
        static void Main(string[] args)
        {
            BaseClass bsc = new BaseClass();
            bsc.Display();

            DerivedClass ddc = new DerivedClass();
            ddc.Display();//输出override的内容

            BaseClass bsc2 = new DerivedClass();
            //通过基类的引用调用派生类的实列时候,根据多态,会执行派生类中的版本
            bsc2.Display(); //输出override的内容
        }
    }
}

抽象方法的使用的例子

cs 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;


//抽象方法的例子
namespace AbstractMethod
{
    public abstract class Shape //含有抽象方法是抽象类
        //抽象类不能实例化
    {
        public abstract double Area(); //抽象方法没有方法体
        public abstract string Name { get; set; } //抽象属性没有具体实现
    }

    public class Rectangle : Shape
    {
        private string name;
        public override string Name//实现抽象属性
        {
            get { return name; }
            set { name = value; }
        }
        private double width;
        private double height;
        public double WIDTH
        {
            get { return width; }
            set { width = value; }
        }
        public double HEIGHT
        {
            get { return height; }
            set { height = value; }
        }

        public override double Area()//子类中重写抽象类中的抽象方法
        {
            return width * height;  
        }
    }
    internal class Program
    {
        static void Main(string[] args)
        {
             Rectangle rt = new Rectangle();
            rt.WIDTH = 100;
            rt.HEIGHT = 200;
            Console.WriteLine(rt.Area());
        }
    }
}
相关推荐
David猪大卫12 分钟前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
用户37215742613541 分钟前
C# 实现 Excel 单元格保护:锁定公式并允许编辑指定区域
c#·ai编程·编程语言
fengci.2 小时前
CTF2MISC中等部分
开发语言·前端·学习
xys_6783 小时前
JavaEE通关手册:初识Java
java·开发语言
ShineWinsu4 小时前
对于Qt:QTableWidget常见属性以及QTableWidgetItem类的解析
开发语言·c++·qt·gui·客户端·表格·qtablewidget
ShineWinsu5 小时前
对于Qt:QListWidget常见属性以及QListWidgetItem类的解析
开发语言·c++·qt·客户端·列表·qlistwidget·qlistwidgetitem
吴名氏.5 小时前
Java转AI Agent教程(第十二周)检索与切分
java·开发语言·人工智能·ai·ai agent
公子小六6 小时前
基于.NET的Windows窗体编程之WinForms数据持久化(1)
windows·microsoft·c#·.net·winforms
瑞雪兆丰年兮6 小时前
JavaWeb-day10-SpringBootWeb案例
java·开发语言·javaweb·web
Elastic 中国社区官方博客6 小时前
更少的位数,相同的召回率:DiskBBQ 更保守的自动校准扫描
大数据·运维·开发语言·人工智能·elasticsearch·搜索引擎