首页 > 编程语言 >C#中扩展方法无法获得多态性的行为

C#中扩展方法无法获得多态性的行为

时间:2023-08-26 11:55:53浏览次数:37  
标签:MakeSound C# 多态性 扩展 Dog Animal 方法

在C#中,扩展方法(Extension Methods)是一种用于给现有类型添加新方法的技术。但是,扩展方法无法实现多态性的行为,因为它们是静态方法,它们的行为是在编译时确定的,而不是在运行时。

多态性是面向对象编程的一个重要概念,它允许不同的对象以不同的方式响应相同的方法调用。多态性的实现依赖于继承和虚方法(virtual methods)等机制,而扩展方法并没有这些特性。

以下是一个示例,说明为什么扩展方法无法获得多态性的行为:

using System;

namespace ExtensionMethodDemo
{
    // 基类
    class Animal
    {
        public void MakeSound()
        {
            Console.WriteLine("动物发出声音");
        }
    }

    // 派生类
    class Dog : Animal
    {
        public new void MakeSound()
        {
            Console.WriteLine("狗发出声音");
        }
    }

    // 扩展方法
    static class AnimalExtensions
    {
        public static void Bark(this Animal animal)
        {
            Console.WriteLine("扩展方法:动物叫");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Animal animal = new Animal();
            Animal dogAsAnimal = new Dog();
            Dog dog = new Dog();

            animal.MakeSound();       // 输出:动物发出声音
            dogAsAnimal.MakeSound();  // 输出:动物发出声音
            dog.MakeSound();          // 输出:狗发出声音

            animal.Bark();            // 输出:扩展方法:动物叫
            dogAsAnimal.Bark();       // 输出:扩展方法:动物叫
            dog.Bark();               // 输出:扩展方法:动物叫
        }
    }
}

在这个示例中,我们有一个基类 Animal 和一个派生类 Dog。基类有一个方法 MakeSound,派生类 Dog 重写了这个方法。然后,我们定义了一个扩展方法 Bark,它可以应用于 Animal 类。

尽管 dogAsAnimal 实际上是一个 Dog 对象,但它被声明为 Animal 类型,所以当调用 MakeSound 方法时,不会调用 Dog 类中的重写方法。而扩展方法 Bark 可以应用于 Animal 类型,但它不会根据实际对象的类型执行不同的行为。这就是为什么扩展方法无法获得多态性行为的原因。

标签:MakeSound,C#,多态性,扩展,Dog,Animal,方法
From: https://www.cnblogs.com/johnyang/p/17658577.html

相关文章

  • MBR400100CT-ASEMI肖特基模块400A 100V
    编辑:llMBR400100CT-ASEMI肖特基模块400A100V型号:MBR400100CT品牌:ASEMI封装:M2恢复时间:>50ns正向电流:400A反向耐压:100V芯片个数:2引脚数量:2类型:肖特基模块特性:肖特基模块、大功率肖特基浪涌电流:3300A正向压降:0.75V~0.85V封装尺寸:如图工作温度:-40°C~175°CMBR400100C......
  • openeuler linux内核4.19安装(centos 同理)
    linux内核安装:安装内核步骤下载相应内核版本【我这里用的是linux-4.19.90.tar.gz】下载网址:https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/解压缩到自定位置【我这里是/root/桌面/send/】安装内核图像界面依赖【已安装则跳过】 yuminstallncurses-deve......
  • AE下载-AdobeAfterEffects官方版下载 中文版直装
    今天给大家带来AE2023最新版不限速下载和安装教程。我们先复制安装包链接。然后返回文件传输助手。发送刚刚复制的链接。打开电脑,在电脑上。浏览器打开链接下载里面的安装包即可,自己下载好后我们就要开始安装了。软件地址:看置顶贴软件功能1、数据驱动的动画使用导入的数据制作动态......
  • CSS-02
    选择器选择器可以快速、方便的选择所需要使用的页面元素基本选择器基础选择分三种,分别是:标签选择器、类选择器、id选择器标签选择器标签选择器主要是根据标签的名字进行元素的选择语法:标签名{}例如:div{color:red;font-size:20px;}<divclass="div-cls">昨日头条:国家公祭日</div><d......
  • 项目学习 鱼皮 API 开放平台 stateful-backend 项目总结
    项目介绍用户中心功能介绍提供了一套基于Session的用户中心,提供以下功能登入登出注册用户信息管理增删改查登录用户查询ID查询列表查询分页查询用户态记录数据库表createtableuser(idbigintauto_incrementcomment'id'......
  • Typora+PicGo 上传图片至GitHub仓库
    提前准备好Github账号、PicGo、Typora创建Github账号地址:https://github.com/下载PicGo地址:https://github.com/Molunerfinn/PicGo/releases/下载Typora地址:https://typora.yjjxx.cn/index.html1.创建Github仓库 点击new新建仓库输入Repositoryname(PicGo中要用到),选择Public......
  • 《CF464E》 解题报告
    好题。今天模拟赛出到这题的究极强化版,于是来写一下这题,也就是弱化版(你管这叫弱化版)其实思路不难,但是比较有趣。首先我们肯定是要维护这么一个高精的,但是如果直接维护肯定鉴定为寄。考虑其他维护方法。首先要知道\(dij\)是肯定不能少的。我们思考\(dij\)主要有两个操作......
  • js对象操作(object)
    声明对象varcan_args=newObject();对象赋值can_args={"vue":300,"jquery":200……};对象动态赋值(新建属性值)第一种:letkey="id";letvalue=2can_args[key]=value;console.error(can_args);//{"vue":300,"jquery":200,......
  • System.Messaging.MessageQueueException: 对消息队列系统的访问被拒绝
    无法启动服务。System.Messaging.MessageQueueException:对消息队列系统的访问被拒绝。使用Windows的消息队列时,窗体界面的应用可以对消息队列进行全部权限的操作,但是编写的Windows服务对消息队列进行操作时有可能会出现此错误提示,在这里提供一种解决方法:首先明确Windows服务程......
  • 分布式数据库CAP原理
    看完了阳哥的redis视频课,理解了MySQL和NoSQL的区别,下面来总结一下传统的ACID分别是什么A(Atomicity)原子性C(Consistency)一致性I(Isolation)独立性D(Durability)持久性关系型数据库遵循ACID规则,事务在英文中是transaction,有如下四个特性:1、A(Atomicity)原子性原子性......