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可保留父类逻辑扩展功能。
相关推荐
汤米粥33 分钟前
Python爬虫中Xpath用法之——normalize-space()
开发语言·python
科技道人42 分钟前
记录 设置-显示大小和字体
开发语言·android设置·字体和显示大小
浮江雾1 小时前
Flutter第三节----Dart中的数据类型
android·开发语言·学习·flutter·入门·函数
weixin_422329311 小时前
AgentScope Java 项目入门 & Builder 深度解读
java·开发语言·人工智能
2601_962364971 小时前
告别明文密码:Windows Hello 抗钓鱼双因子认证安全体系科普
windows
chh5631 小时前
C++--list
开发语言·数据结构·c++·学习·算法·list
杰佛史彦明11 小时前
ElasticSearch中的分词器详解
大数据·elasticsearch·c#
Edward111111112 小时前
一AI名词
java·开发语言·数据库·学习
aaPIXa6222 小时前
C++ 移动语义、完美转发与引用折叠详解
java·开发语言·c++
栈溢出了2 小时前
Redis repl_backlog 学习笔记
java·开发语言·redis·学习