C# 中什么是重写(子类改写父类方法)

方法重写是指在继承关系中,子类重新实现父类或基类的某个方法。这种方法允许子类根据需要修改或扩展父类或基类的方法功能。在面向对象编程中,方法重写是一种多态的表现形式,它使得子类可以根据不同的需求和场景提供不同的方法实现。

方法重写的基本规则如下:

  1. 方法重写要求子类中的方法与父类或基类中的方法具有相同的方法名、返回类型和参数列表。
  2. 方法重写中的方法可以有不同的实现逻辑,但方法名、返回类型和参数列表必须与父类或基类中的方法保持一致。
  3. 方法重写只能在子类中进行,不能在父类或基类中进行。

在C#中,override 是一个关键字,用于在子类中重写(覆盖)父类中已有的虚拟方法、属性或索引器。

当一个方法、属性或索引器被声明为 virtual 时,它允许子类通过 override 关键字来提供自己的实现版本。通过重写父类的成员,子类可以修改或扩展继承的行为,以满足自身的需求。

下面是使用 override 的一个简单示例:

复制代码
public class Animal
{
    public virtual void Speak()
    {
        Console.WriteLine("我是动物。");
    }
}

public class Cat : Animal
{
    public override void Speak()
    {
        Console.WriteLine("我是一只猫咪,喵喵喵~");
    }
}

在这个示例中,Animal 类中的 Speak() 方法被声明为 virtual,表示它可以被子类重写。Cat 类继承了 Animal 类,并使用 override 关键字重写了父类的 Speak() 方法。

通过使用 overrideCat 类提供了自己的 Speak() 方法实现。当我们实例化 Cat 对象并调用 Speak() 方法时,会执行子类重写后的方法,输出 "我是一只猫咪,喵喵喵~"。

总结起来,override 关键字用于在子类中重写(覆盖)父类中已有的虚拟方法、属性或索引器。它允许子类根据自身需要修改或扩展继承的成员的行为。通过使用 virtualoverride,可以实现多态性,在运行时根据对象的实际类型调用相应的重写版本。

其他案例

复制代码
class Animal {  
   void makeSound() {  
       System.out.println("The animal makes a sound");  
   }  
}
 
class Dog extends Animal {  
   @Override  
   void makeSound() {  
       System.out.println("The dog barks");  
   }  
}
 
public class Main {  
   public static void main(String[] args) {  
       Dog dog = new Dog();  
       dog.makeSound(); // 输出:The dog barks  
   }  
}

在这个示例中,Dog 类继承了 Animal 类,并重写了 makeSound() 方法。当创建一个 Dog 对象并调用 makeSound() 方法时,将执行 Dog 类中的方法实现,输出 "The dog barks"。

2.子类重写了父类的方法,子类的实例化对象在调用该方法输出子类方法结果

当子类重写了父类的方法后,子类的实例化对象在调用该方法名字时,将输出子类重写的新方法的结果。这是因为在 C# 中,方法重写遵循一种称为"动态绑定"的规则。

动态绑定是指在运行时,根据实际的对象类型来调用相应的方法。当子类实例化对象调用重写的方法时,实际上是在调用子类中的新方法。因此,输出的结果是子类重写的新方法的结果。

以下是一个简单的示例:

复制代码
public class Animal {  
   public void MakeSound() {  
       Console.WriteLine("The animal makes a sound");  
   }  
}
 
public class Dog : Animal {  
   public override void MakeSound() {  
       Console.WriteLine("The dog barks");  
   }  
}
 
public class Main {  
   public static void Main() {  
       Dog dog = new Dog();  
       dog.MakeSound(); // 输出:The dog barks  
   }  
}

这个示例中,子类 Dog 重写了父类 AnimalMakeSound 方法。在 Main 类中,我们创建了一个 Dog 对象,并调用了其 MakeSound 方法。由于动态绑定的规则,调用的是子类中的新方法,因此输出的结果是 "The dog barks"。

相关推荐
Jelena157795857921 分钟前
Java爬虫淘宝拍立淘item_search_img拍接口示例代码
开发语言·python
郝学胜-神的一滴15 分钟前
Python数据模型:深入解析及其对Python生态的影响
开发语言·网络·python·程序人生·性能优化
一水鉴天21 分钟前
整体设计 定稿 之26 重构和改造现有程序结构 之2 (codebuddy)
开发语言·人工智能·重构·架构
star _chen44 分钟前
C++ std::move()详解:从小白到高手
开发语言·c++
lzhdim1 小时前
C#开发者必知的100个黑科技(前50)!从主构造函数到源生成器全面掌握
开发语言·科技·c#
刺客xs1 小时前
Qt----事件简述
开发语言·qt
程序员-King.1 小时前
【Qt开源项目】— ModbusScope-进度规划
开发语言·qt
syt_10131 小时前
Object.defineProperty和Proxy实现拦截的区别
开发语言·前端·javascript
liu****1 小时前
Python 基础语法(二):程序流程控制
开发语言·python·python基础
charlie1145141911 小时前
如何快速在 VS2026 上使用 C++ 模块 — 完整上手指南
开发语言·c++·笔记·学习·现代c++