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 类型,但它不会根据实际对象的类型执行不同的行为。这就是为什么扩展方法无法获得多态性行为的原因。
C#中扩展方法无法获得多态性的行为的更多相关文章
- C#中扩展方法
什么是扩展方法? 扩展方法顾名思义,就是允许向现有的“类型”添加方法,而无需创建派生类.重新编译或以其他方式修改原来类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 扩 ...
- C#中扩展方法的使用
MSDN中这样定义扩展方法:扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. ...
- 关于C#中”扩展方法必须在非泛型静态类中定义“问题的解决
问题描述: 在某个窗口下的编码中使用了以下扩展方法FindControl,以求根据字符串的值去操作控件(本文中的控件为Label控件)的属性. public static Control FindCo ...
- .NET: 谈谈C#中的扩展方法
扩展方法(Extension Methods)是C#3.0时引入的新特性,相信很多人都听过并且也都用过,最常见的是在LINQ中的使用. 不仅如此,在开发中,我们也可以创建自己扩展方法,使用它来优化类的 ...
- ASP.NET MVC之持久化TempData及扩展方法(十三)
前言 之前在开始该系列之前我们就讲述了在MVC中从控制器到视图传递数据的四种方式,但是还是存在一点问题,本节就这个问题进行讲述同时进行一些练习来看看MVC中的扩展方法. 话题 废话不必多说,我们直接进 ...
- .NET 扩展方法 (二)
上一篇随笔 .NET 扩展方法 (一) 已经对 扩展方法有了大致的介绍,这篇算是一个补充,让我们来看一下扩展方法的几个细节: 一.扩展方法具有继承性 当使用扩展方法扩展一个类型的时候,其也扩展了派生类 ...
- MVC 扩展方法特点
.NET MVC 3中扩展方法特点: (1)扩展类的名称以Extensions结尾: (2)扩展类的类型是static: (3)扩展方法至少有一个参数,第一个参数必须指定该方法作用于哪个类型,并且该参 ...
- 用扩展方法实现DevExpress-GridControl级联效果
首先,让我们先回顾下.Net中扩展方法的特征: 1. 必须在一个非嵌套.非泛型的静态类中: 2. 至少有一个参数(this 作前缀的参数): 3. 第一个参数必须附加this做前缀: 4. 第 ...
- C#中的扩展方法
扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 以上是msdn官网对扩展方 ...
- .NET中那些所谓的新语法之二:匿名类、匿名方法与扩展方法
开篇:在上一篇中,我们了解了自动属性.隐式类型.自动初始化器等所谓的新语法,这一篇我们继续征程,看看匿名类.匿名方法以及常用的扩展方法.虽然,都是很常见的东西,但是未必我们都明白其中蕴含的奥妙.所以, ...
随机推荐
- 常见的各类LLM基座模型(GPT、DeepSeek、Qwen等)模型解析以及对比
From: https://www.big-yellow-j.top/posts/2025/02/15/LLM.html 各类LLM模型技术汇总 只去对比整体框架,对所采用的激活函数,归一化处理,位置 ...
- C# TCP/IP通信,Socket通信例子
1.服务端建立监听,等待客户端连接 class Program { static void Main(string[] args) { TcpListener listener = new TcpLi ...
- ppt 文字 +图 样式 设计
1. 设计前 设计后 图 +文字排版 图多 字少
- golang interface 转 string、int、float64
interface{} interface{} 接口.interface{} 类型很多人都会混淆.interface{} 类型是没有方法的接口.由于没有 implements 关键字,所以说所有的类型 ...
- 从零创建npm依赖,只需执行一条命令
由来 最近在弄新的npm依赖,但是发现没有都从头创建项目实属有点儿麻烦,然后我找了之前开发的依赖,将多余代码删除了作为初始化的项目.于是~为什么不弄个模版,每次只需要初始化模版即可,所以就有了这个模版 ...
- “你觉得客户需要”是杀死TA的最后一根稻草 | IPD集成产品开发
这个米老鼠洗衣机,大家眼熟吗? 相信最近热衷于在网上冲浪的朋友们,对这款形似米老鼠的"懒人洗衣机"并不陌生,甚至算是小小地参与了一下这个产品研发项目.在海尔的周云杰总裁爆火出圈后, ...
- doctrine-orm基础(单用doctrine避坑指南)
附: doctrine基础(一):https://www.jianshu.com/p/3681e1add282 doctrine官网: https://www.doctrine-project.org ...
- [转自洛谷]洛谷KateX公式大全【LateX】
前言 由于在洛谷,有很多人对于\(\KaTeX\)和\(\LaTeX\)之间的关系并不清楚,导致很多人去搜\(\LaTeX\)的资料,然后发现有许多指令无法在洛谷运行. 但是事实上,\(\KaTeX\ ...
- 使用“一次开发,多端部署”,实现Pura X阔折叠的全新设计
3月20日,华为发布业界首款阔折叠手机Pura X,其独特的16:10阔型屏设计,为用户带来焕然一新的体验.然而随着鸿蒙生态设备类型的日益丰富,不同类型设备的应用适配成为开发者面临的一大挑战.为此,华 ...
- 47.3K star!这款开源RAG引擎真香!文档理解+精准检索+可视化干预,一站式搞定!
嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 RAGFlow 是基于深度文档理解的开源RAG引擎,通过与LLM结合提供带精准引用的问答能力 ...