override关键字用于子类重写基类的virtual、abstract或override成员,实现多态;要求方法签名完全匹配,且基类成员必须可被重写;与new关键字不同,override实现运行时多态,而new是方法隐藏;重写时可通过base调用基类实现,常用于扩展而非替换行为;还可结合sealed防止进一步重写。

C#中,
override
virtual
abstract
override
当我们谈论
override
Vehicle
Move()
Move()
virtual
abstract
子类,比如
Car
Airplane
override
Move()
public class Vehicle
{
    // virtual 关键字表示这个方法可以被子类重写
    public virtual void Move()
    {
        Console.WriteLine("Vehicle is moving.");
    }
}
public class Car : Vehicle
{
    // override 关键字表示重写基类的 Move 方法
    public override void Move()
    {
        // 可以选择调用基类实现,也可以完全替换
        // base.Move(); 
        Console.WriteLine("Car is driving on the road.");
    }
}
public class Airplane : Vehicle
{
    public override void Move()
    {
        Console.WriteLine("Airplane is flying in the sky.");
    }
}
// 实际使用
// Vehicle myCar = new Car();
// myCar.Move(); // 输出:Car is driving on the road.
// Vehicle myPlane = new Airplane();
// myPlane.Move(); // 输出:Airplane is flying in the sky.这让我们的代码变得异常灵活和可扩展。你可以用一个基类引用来操作不同类型的对象,而运行时会根据实际对象的类型来调用正确的方法。这种“一个接口,多种实现”的哲学,正是面向对象编程的魅力所在。
override
要成功地使用
override
首先,被重写的方法、属性或事件在基类中必须明确地被标记为
virtual
abstract
override
virtual
abstract
sealed
其次,方法签名必须完全匹配。这意味着什么?就是方法的名称、参数的类型和数量、参数的顺序,甚至返回值类型,都必须和基类中被重写的方法一模一样。这是语言层面在强制一种契约:你承诺了要提供这个功能,但具体实现可以变。如果签名不一致,那就不叫重写了,那叫定义了一个全新的方法,即使名字相同。
访问修饰符也得保持一致,或者在子类中可以放宽。比如,基类中的
virtual
protected
protected
public
private
override
new
初学C#时,很多人会混淆
override
new
new
new
举个例子:
public class BaseClass
{
    public void Show()
    {
        Console.WriteLine("BaseClass Show");
    }
}
public class DerivedClass : BaseClass
{
    public new void Show() // 使用 new 隐藏基类的 Show 方法
    {
        Console.WriteLine("DerivedClass Show");
    }
}
// BaseClass b = new DerivedClass();
// b.Show(); // 输出:BaseClass Show (因为变量类型是 BaseClass)
// DerivedClass d = new DerivedClass();
// d.Show(); // 输出:DerivedClass Show (因为变量类型是 DerivedClass)而
override
override
new
使用
override
base
base
一个典型的场景是扩展基类的行为,而不是完全替换它。比如,你有一个
LogMessage
base.LogMessage()
public class Logger
{
    public virtual void Log(string message)
    {
        Console.WriteLine($"[Console Log]: {message}");
    }
}
public class FileLogger : Logger
{
    public override void Log(string message)
    {
        // 先调用基类的日志功能
        base.Log(message); 
        // 再添加子类特有的文件日志功能
        System.IO.File.AppendAllText("log.txt", $"[File Log]: {message}\n");
        Console.WriteLine($"[File Logged]: {message}");
    }
}
// Logger myLogger = new FileLogger();
// myLogger.Log("This is a test message.");
// 输出:
// [Console Log]: This is a test message.
// [File Logged]: This is a test message.
// 同时,消息也会被写入 log.txt 文件另一个场景是初始化或清理。比如,你有一个复杂的对象初始化过程,基类负责通用的初始化,而子类需要在此基础上进行一些特定的设置。在子类的构造函数或初始化方法中,调用
base
但也要注意,不是所有情况都需要调用
base
Vehicle
Car
Move
base.Move()
最后,值得一提的是
sealed
override
sealed
以上就是C#的override关键字如何重写虚方法?有什么要求?的详细内容,更多请关注php中文网其它相关文章!
 
                        
                        每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
 
                 
                                
                                 收藏
收藏
                                                                             
                                
                                 收藏
收藏
                                                                             
                                
                                 收藏
收藏
                                                                            Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号