C#中扩展方法无法获得多态性的行为
时间:2023-08-26
本文章向大家介绍C#中扩展方法无法获得多态性的行为,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
在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 类型,但它不会根据实际对象的类型执行不同的行为。这就是为什么扩展方法无法获得多态性行为的原因。
原文地址:https://www.cnblogs.com/johnyang/p/17658577.html
- Github 项目推荐 | 微软开源 MMdnn,模型可在多框架间转换
- 半自动化运维之动态添加数据文件(一) (r5笔记第55天)
- 半自动化运维之动态添加数据文件(二) (r5笔记第56天)
- 11g Active DataGuard初探(r5笔记第54天)
- Github 项目推荐 | 用于构建端对端对话系统和训练聊天机器人的开源库 —— DeepPavlov
- 我身边的一些数据库事故 (r5笔记第52天)
- 一个清理脚本的改进思路(r5笔记第51天)
- 【专业技术】Python爬虫:抓取手机APP的传输数据
- 海量数据迁移之传输表空间(一) (r5笔记第71天)
- 一条sql语句的改进探索(r5笔记第70天)
- 【专业技术】Node.js 究竟是什么?
- Github 项目推荐 | 用 Pytorch 实现的 WaveNet-Vocoder
- 重启数据库的一场闹剧(r5笔记第68天)
- 【C语言系列】基础语法案例分析(初级篇)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 接口测试框架接入性能测试实践分享
- 熟悉又陌生的 k8s 字段:finalizers
- python+selenium 外部文件导入操作
- 小书MybatisPlus第1篇-整合SpringBoot快速开始增删改查
- K8S 生态周报| Istio v1.7.1 发布
- MongoDB设计方法及技巧
- 我要以血和泪的经历告诉你,这个 bug 太难解决了
- Loki和Fluentd的那点事儿
- 恕我直言你可能真的不会java第9篇-元素的匹配与查找
- 恕我直言你可能真的不会java第8篇-函数式接口
- 突破 DockerHub 限制,全镜像加速服务
- 恕我直言你可能真的不会java第7篇:像使用SQL一样排序集合
- K8S 生态周报| KIND v0.9 发布带来众多更新
- oracle 数据回滚,恢复误删的数据,闪回表功能的使用
- C语言 | 关于结构体内存对齐,看这篇就够了