C# 继承与虚方法

继承与虚方法重写的区别

继承允许子类获取父类的成员(字段、属性、方法等),而虚方法重写(virtualoverride)是继承中的一种多态机制,允许子类重新定义父类中标记为virtual的方法。

  • 继承:子类自动拥有父类的非私有成员,无需重新实现。
  • 虚方法重写 :父类用virtual声明方法,子类用override重写逻辑,运行时根据对象实际类型调用对应方法。

示例代码

csharp 复制代码
using System;

// 父类
public class Animal
{
    // 虚方法
    public virtual void MakeSound()
    {
        Console.WriteLine("Animal makes a sound");
    }
}

// 子类重写虚方法
public class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("Dog barks");
    }
}

// 子类不重写虚方法
public class Cat : Animal
{
    // 使用父类的默认实现
}

class Program
{
    static void Main()
    {
        Animal animal = new Animal();
        Animal dog = new Dog();
        Animal cat = new Cat();

        animal.MakeSound(); // 输出: Animal makes a sound
        dog.MakeSound();    // 输出: Dog barks
        cat.MakeSound();    // 输出: Animal makes a sound
    }
}

常见问题与处理方法

问题1:忘记标记virtualoverride

  • 若父类方法未标记virtual,子类无法重写。
  • 若子类用new代替override,会导致隐藏而非重写(编译警告)。

修正方法

csharp 复制代码
public class Bird : Animal
{
    public override void MakeSound() // 正确使用override
    {
        Console.WriteLine("Bird chirps");
    }
}

问题2:误用new关键字导致隐藏

  • new会隐藏父类方法,破坏多态性。

修正方法

csharp 复制代码
public class Fish : Animal
{
    public new void MakeSound() // 不推荐,仅用于特殊场景
    {
        Console.WriteLine("Fish bubbles");
    }
}

问题3:基类调用被重写方法

  • 子类可通过base调用父类实现。

示例

csharp 复制代码
public class Lion : Animal
{
    public override void MakeSound()
    {
        base.MakeSound(); // 调用父类方法
        Console.WriteLine("Lion roars");
    }
}

关键总结

  • 多态需通过virtualoverride配合实现。
  • 避免滥用new,优先使用重写。
  • 使用base可保留父类逻辑扩展功能。
相关推荐
我滴老baby1 小时前
企业级工具链设计从单一工具到分层工具体系的架构实践
java·开发语言·架构
月昤昽1 小时前
C#实现AutoCAD旋转与直径标注
c#·.net·二次开发·autocad·autocad二次开发
AI玫瑰助手1 小时前
Python流程控制:if-else与if-elif-else嵌套使用
开发语言·python·信息可视化
无限进步_1 小时前
【C++】深入底层:自己动手实现一个哈希表
开发语言·数据结构·c++·算法·链表·散列表·visual studio
小杍随笔1 小时前
【在 Rust + Tauri 2 应用中实现语言切换功能:完整技术指南】
开发语言·后端·rust
minji...2 小时前
Linux 网络基础之UDP协议(四)传输层协议 UDP,再谈端口号,UDP 特点
linux·服务器·开发语言·网络·c++·tcp/ip·udp
逻辑驱动的ken2 小时前
Java高频面试考点场景题27
java·开发语言·面试·职场和发展·求职招聘
清水白石0082 小时前
从手写初始化到 pytest fixture:让 Python 测试既干净、可复用,又能驾驭异步并发
开发语言·python·pytest