在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#中扩展方法无法获得多态性的行为的更多相关文章

  1. C#中扩展方法

    什么是扩展方法? 扩展方法顾名思义,就是允许向现有的“类型”添加方法,而无需创建派生类.重新编译或以其他方式修改原来类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 扩 ...

  2. C#中扩展方法的使用

    MSDN中这样定义扩展方法:扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. ...

  3. 关于C#中”扩展方法必须在非泛型静态类中定义“问题的解决

    问题描述: 在某个窗口下的编码中使用了以下扩展方法FindControl,以求根据字符串的值去操作控件(本文中的控件为Label控件)的属性. public static Control FindCo ...

  4. .NET: 谈谈C#中的扩展方法

    扩展方法(Extension Methods)是C#3.0时引入的新特性,相信很多人都听过并且也都用过,最常见的是在LINQ中的使用. 不仅如此,在开发中,我们也可以创建自己扩展方法,使用它来优化类的 ...

  5. ASP.NET MVC之持久化TempData及扩展方法(十三)

    前言 之前在开始该系列之前我们就讲述了在MVC中从控制器到视图传递数据的四种方式,但是还是存在一点问题,本节就这个问题进行讲述同时进行一些练习来看看MVC中的扩展方法. 话题 废话不必多说,我们直接进 ...

  6. .NET 扩展方法 (二)

    上一篇随笔 .NET 扩展方法 (一) 已经对 扩展方法有了大致的介绍,这篇算是一个补充,让我们来看一下扩展方法的几个细节: 一.扩展方法具有继承性 当使用扩展方法扩展一个类型的时候,其也扩展了派生类 ...

  7. MVC 扩展方法特点

    .NET MVC 3中扩展方法特点: (1)扩展类的名称以Extensions结尾: (2)扩展类的类型是static: (3)扩展方法至少有一个参数,第一个参数必须指定该方法作用于哪个类型,并且该参 ...

  8. 用扩展方法实现DevExpress-GridControl级联效果

    首先,让我们先回顾下.Net中扩展方法的特征: 1.  必须在一个非嵌套.非泛型的静态类中: 2.  至少有一个参数(this 作前缀的参数): 3.  第一个参数必须附加this做前缀: 4.  第 ...

  9. C#中的扩展方法

    扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样进行调用. 以上是msdn官网对扩展方 ...

  10. .NET中那些所谓的新语法之二:匿名类、匿名方法与扩展方法

    开篇:在上一篇中,我们了解了自动属性.隐式类型.自动初始化器等所谓的新语法,这一篇我们继续征程,看看匿名类.匿名方法以及常用的扩展方法.虽然,都是很常见的东西,但是未必我们都明白其中蕴含的奥妙.所以, ...

随机推荐

  1. 常见的各类LLM基座模型(GPT、DeepSeek、Qwen等)模型解析以及对比

    From: https://www.big-yellow-j.top/posts/2025/02/15/LLM.html 各类LLM模型技术汇总 只去对比整体框架,对所采用的激活函数,归一化处理,位置 ...

  2. C# TCP/IP通信,Socket通信例子

    1.服务端建立监听,等待客户端连接 class Program { static void Main(string[] args) { TcpListener listener = new TcpLi ...

  3. ppt 文字 +图 样式 设计

    1. 设计前 设计后 图 +文字排版 图多 字少

  4. golang interface 转 string、int、float64

    interface{} interface{} 接口.interface{} 类型很多人都会混淆.interface{} 类型是没有方法的接口.由于没有 implements 关键字,所以说所有的类型 ...

  5. 从零创建npm依赖,只需执行一条命令

    由来 最近在弄新的npm依赖,但是发现没有都从头创建项目实属有点儿麻烦,然后我找了之前开发的依赖,将多余代码删除了作为初始化的项目.于是~为什么不弄个模版,每次只需要初始化模版即可,所以就有了这个模版 ...

  6. “你觉得客户需要”是杀死TA的最后一根稻草 | IPD集成产品开发

    这个米老鼠洗衣机,大家眼熟吗? 相信最近热衷于在网上冲浪的朋友们,对这款形似米老鼠的"懒人洗衣机"并不陌生,甚至算是小小地参与了一下这个产品研发项目.在海尔的周云杰总裁爆火出圈后, ...

  7. doctrine-orm基础(单用doctrine避坑指南)

    附: doctrine基础(一):https://www.jianshu.com/p/3681e1add282 doctrine官网: https://www.doctrine-project.org ...

  8. [转自洛谷]洛谷KateX公式大全【LateX】

    前言 由于在洛谷,有很多人对于\(\KaTeX\)和\(\LaTeX\)之间的关系并不清楚,导致很多人去搜\(\LaTeX\)的资料,然后发现有许多指令无法在洛谷运行. 但是事实上,\(\KaTeX\ ...

  9. 使用“一次开发,多端部署”,实现Pura X阔折叠的全新设计

    3月20日,华为发布业界首款阔折叠手机Pura X,其独特的16:10阔型屏设计,为用户带来焕然一新的体验.然而随着鸿蒙生态设备类型的日益丰富,不同类型设备的应用适配成为开发者面临的一大挑战.为此,华 ...

  10. 47.3K star!这款开源RAG引擎真香!文档理解+精准检索+可视化干预,一站式搞定!

    嗨,大家好,我是小华同学,关注我们获得"最新.最全.最优质"开源项目和高效工作学习方法 RAGFlow 是基于深度文档理解的开源RAG引擎,通过与LLM结合提供带精准引用的问答能力 ...