【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