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可保留父类逻辑扩展功能。
相关推荐
唐青枫10 小时前
别再乱用 StartNew:C#.NET TaskFactory 任务调度实战详解
c#·.net
Artech18 小时前
[MAF预定义的AIContextProvider-03]ChatHistoryMemoryProvider——赋予Agent从经验中学习的能力
ai·c#·agent·memory·maf
Scout-leaf2 天前
C#摸鱼实录——IoC与DI案例详解
c#
咕白m6252 天前
使用 C# 在 Excel 中应用多种字体样式
后端·c#
Artech3 天前
[MAF预定义的AIContextProvider-02]AgentSkillsProvider——将Agent Skills引入MAF
ai·c#·agent·agent skills·maf
LDR0063 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术3 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园3 天前
C++20 Modules 模块详解
java·开发语言·spring
swordbob3 天前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio
qq_369224333 天前
Windows全系通用!ntdll.dll文件丢失、报错、闪退问题的完整排查与修复教程
windows·dll·dll修复·dll丢失·dll错误