C#virtual关键

本文介绍了C#中的virtual关键字,用于使类成员成为虚拟的,允许在继承后进行重写。讨论了virtual如何修饰方法、属性、索引器和事件,并强调其不能与static一起使用。还讲解了override关键字用于子类重写父类成员,并通过实例展示了如何在子类中重写父类的方法,以及如何利用base关键字调用父类的实现来避免代码冗余。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C# virtual是虚拟的含义,在C#语言中,默认情况下类中的成员都是非虚拟的,通常将类中的成员定义成虚拟的,表示这些成员将会在继承后重写其中的内容。virtual关键字能修饰方法、属性、索引器以及事件等,用到父类的成员中。

使用 virtual 关键字修饰属性和方法的语法形式如下:
public virtual 数据类型 属性名{get; set; }
访问修饰符 virtual 返回值类型方法名
{
语句块;
}

需要注意的是,virtual关键字不能修饰使用static修饰的成员。此外,virtual关键字既可以添加到访问修饰符的后面,也可以添加到访问修饰符的前面,但实际应用中习惯将该关键字放到访问修饰符的后面。子类继承父类后能重写父类中的成员,重写的关键字是override。所谓重写是指子类和父类的成员定义一致,仅在子类中增加了override关键字修饰成员。

例如在父类中有一个求长方形面积的方法,方法定义如下
publie int Area(int x, int y)
{
return x * y
}
在子类中重写该方法的代码如下
public override int Area(int x,int y)
{
语句块;
return 整数类型的值;
}
在子类中重写父类中的方法后能改变方法体中的内容,但是方法的定义不能改变

为了减少重复的代码,在每个类中省略了属性部分的定义内容,仅保留 Print 方法部分的内容,实现 的代码如下
class Person
{
public virtual void Print()
{
Console.WriteLine(“编号:”+ Id);
Console.WriteLine(“姓名:”+ Name);
Console.WriteLine(“性别:”+ Sex);
Console.WriteLine(“身份证号:”+ Cardid);
Console.WriteLine(“联系方式:”+ Tel);
}
}
class Student:Person
{
public override void Print()
{
Console.WriteLine(“编号:”+ Id);
Console.WriteLine(“姓名:”+ Name);
Console.WriteLine(“性别:”+ Sex);
Console.WriteLine(“身份证号:”+ Cardid);
Console.WriteLine(“联系方式:”+ Tel);
Console.WriteLine(“专业:”+ Major);
Console.WriteLine(“年级:”+ Grade);
}
}

class Teacher:Person
{
public override void Print()
{
Console.WriteLine(“编号:”+ Id);
Console.WriteLine(“姓名:”+ Name);
Console.WriteLine(“性别:”+ Sex);
Console.WriteLine(“身份证号:”+ Cardid);
Console.WriteLine(“联系方式:”+ Tel);
Console.WriteLine(“职称:” + Title);
Console.WriteLine(“工资号:” + WageNo);
}
}

通过上面的代码即可完成对 Person类中 Print方法的重写,在重写后的 Print 方法中能直接调用在Person类中定义的成员。但读者会发现在Person类的Print中已经对Person中的相关属性编写了输出操作的代码,而每一个子类中又重复地编写了代码,造成代码的冗余,也没有体现出代码重用的特点。如果能在重写父类方法的同时直接使用父类中已经编写过的内容就会方便很多。在重写Print方法后仍然需要使用base关键字调用父类中的Print方法执行相应的操作。

C#中,`virtual`关键字用于声明一个方法、属性、索引器或事件可以被派生类重写。它是面向对象编程中实现多态性的一种关键机制。 当一个基类的方法或成员被声明为`virtual`时,它可以在派生类中被重写(Override)。这意味着派生类可以提供自己的实现逻辑,覆盖基类中的默认行为。使用`virtual`关键字可以实现运行时多态,让编译器根据实际对象类型来调用正确的方法。 以下是使用`virtual`关键字的示例: ```csharp public class Animal { public virtual void MakeSound() { Console.WriteLine("The animal makes a sound."); } } public class Cat : Animal { public override void MakeSound() { Console.WriteLine("The cat says meow."); } } public class Dog : Animal { public override void MakeSound() { Console.WriteLine("The dog says woof."); } } // 调用示例 Animal animal = new Animal(); animal.MakeSound(); // 输出:The animal makes a sound. Animal cat = new Cat(); cat.MakeSound(); // 输出:The cat says meow. Animal dog = new Dog(); dog.MakeSound(); // 输出:The dog says woof. ``` 在上面的示例中,`Animal`类中的`MakeSound()`方法被声明为`virtual`,而派生类`Cat`和`Dog`分别重写了该方法。在运行时,根据对象的实际类型,调用相应的重写方法。 需要注意的是,只有`virtual`、`override`和`abstract`修饰的方法才能被派生类重写。同时,派生类中的重写方法必须使用`override`关键字进行标记,以确保正确的重写关系。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值