【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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值