千家信息网

如何理解OO世界中的核心概念 .NET中的多态

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇文章为大家展示了OO世界中的核心概念 .NET中的多态,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。多态(Polymorphism)一词源于生物学,顾名思
千家信息网最后更新 2026年11月01日如何理解OO世界中的核心概念 .NET中的多态

本篇文章为大家展示了OO世界中的核心概念 .NET中的多态,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

多态(Polymorphism)一词源于生物学,顾名思义就是指多种形态。在面向对象世界里,多态与继承和封装一起构成了三大核心概念。

.NET中的多态通常意味着子类对于父类一种衍变。子类继承自父类,拥有父类所定义的一切(public或protected)成员。但同时,它又可以修改(重写或复写)这些成员,使其实现与父类以及其他子类完全不同。我们可以说,继承体现了类的多态性。

大家应该很熟悉Duck的例子了吧?

public abstract class Duck  {      public abstract void Quack();  }   public class MallardDuck : Duck  {      public override void Quack()      {          Console.WriteLine("Quack, quack, quack...");      }  }   public class RubberDuck : Duck  {      public override void Quack()      {          Console.WriteLine("Squeak, squeak, squeak...");      }  }   public class Program  {      public static void Main()      {          Duck duck = new MallardDuck();          duck.Quack();          duck = new RubberDuck();          duck.Quack();          Console.ReadLine();      }  }

MallardDuck和RubberDuck虽然都继承自抽象类Duck,同样拥有Quack()方法,但它们却有不同的实现,产生不同的结果。在声明Duck类型时,既可以实例化为Mallard,也可以实例化为RubberDuck,或者是其他继承自Duck的类,在运行时,将自动调用各个子类的实现。

多态的这些特性使依赖注入和面向抽象编程成为可能,其重要性不言而喻。

不一样的多态

然而,既然多态是指同一类事物之间的不同形态,那么我们为什么要把对于多态的理解局限于类的继承关系呢?在.NET中是否还存在着非继承关系的多态性呢?

泛型体现了参数的多态性

类型参数在泛型中通常解释为占位符,而我更愿意将其理解为对参数的一种抽象。以最常见的List< T>为例,List< string>和List< int>在语法上完全相同,仅仅是类型参数有所不同,然而它们却是两个完全不同的类。也就是说,是类型参数的不同,导致了不同的类的形态。

public class MyList< T>  {      private T[] items;      private int size;      public void Add(T item)      {          if (size == items.Length)          {              // modify capacity          }          items[size++] = item;      }  }

如果我们使用MyList< string>,在内部就会声明一个字符串数组,Add方法的参数也必须为string。如果使用MyList< int>,在内部就会声明一个int数组,Add方法的参数也必须为int。这看上去就像是T是string和int的"基类",在使用MyList< T>时(相当于客户端代码),T既可以是string也可以是int,或者是其他符合约束的类型,但在设计时,我们对这一切毫无所知。

您是否也觉得这是多态性的一种体现呢?

再来看看十分经典的Swap< T>的例子。

public class Swapper  {      private static void Swap< T>(ref T o1, ref T o2)      {          T temp = o1;          o1 = o2;          o2 = temp;      }  }

Swap< T>泛型方法就像是封装了N个非泛型的Swap方法,如Swap(ref int o1, ref int o2)、Swap(ref string o1, ref string o2)等等。在类型推断特性的支持下,您甚至可以像使用非泛型方法一样来使用泛型方法。参数T在某种程度上体现了不同的参数形态,因此我们有理由认为,泛型类型T体现了参数的多态性。

委托体现了方法的多态性

委托是对拥有相同参数和返回值的所有方法的封装。只要方法拥有同样的参数列表和返回值,委托都认为它们属于同一"类型"的方法,可以添加到同一个委托链表中。

public delegate void FooDelegate(List< string> list, string str);   public class DelegateTest  {      public void AddToList(List< string> list, string strToAdd)      {          list.Add(strToAdd);      }       public static void PrintIfContains(List< string> list, string strToCheck)      {          if (list.Contains(strToCheck))              Console.WriteLine("The list contains " + strToCheck);      }  }   public class Program  {      public static void Main()      {          List< string> list = new List< string>();          list.Add("Kirin");          DelegateTest delegateTest = new DelegateTest();          FooDelegate fooDelegate = new FooDelegate(delegateTest.AddToList);          fooDelegate += new FooDelegate(DelegateTest.PrintIfContains);          fooDelegate(list, "麒麟.NET");          Console.ReadLine();      }  }

在上例中,FooDelegate委托封装了参数为List< string>和string,并且没有返回值的方法。任何符合上述约束的方法,在FooDelegate中一视同仁。如,AddToList实例方法与PrintIfContains静态方法除了参数列表与返回值相同外,内部实现完全不同,但是它们却可以添加到同一个委托链表中。也就是说,同一个委托,可以定义并调用不同的方法(约束相同而实现不同)。

您是否也认为这是方法的多态性的一种体现呢?

小结

我们通常所讨论的多态,就是指子类对父类方法的重写(虚方法)或覆盖(非虚方法),这样的理解未免过于狭隘。.NET强大的特性能够实现其他语言中无法实现的多态性。

上述内容就是OO世界中的核心概念 .NET中的多态,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

方法 多态 参数 不同 多态性 类型 委托 子类 相同 形态 封装 世界 核心 概念 实例 就是 特性 也就是 也就是说 例子 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 高科技互联网 互联网科技有限公司经营范围 互联网中国科技 互联网与科技金融数据 互联网金融科技平台 掌上梦互联网科技 长亮科技 互联网金融 互联网科技视频素材 深圳卡尔迅互联网科技有限公司怎么样 互联网科技与大数据专业 晋城互联网科技 互联网金融科技名词解释 恒生互联网科技业指数调整周期 每天都有哪些好的互联网科技 互联网科技实习生岗位 互联网科技股为什么大涨 济南小医互联网科技有限公司招聘 银川新华互联网科技学校是国营吗 悟空问答互联网科技 玉溪新华互联网科技怎么选 互联网科技名片 左右互联网络科技 海南购全球互联网科技 港股科技和互联网 珠海东科互联网科技有限公司 云鲸互联网络科技有限公司 数字科技和互联网金融哪个好 高科技和互联网的现代国家 六子台科技互联网展会 如何强化互联网金融科技
0