知识大全 浅谈.NET中不一样的多态

Posted

篇首语:得意犹堪夸世俗,诏黄新湿字如鸦。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 浅谈.NET中不一样的多态相关的知识,希望对你有一定的参考价值。

浅谈.NET中不一样的多态  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  在 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 为例 List 和List 在语法上完全相同 仅仅是类型参数有所不同 然而它们却是两个完全不同的类 也就是说 是类型参数的不同 导致了不同的类的形态

  

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

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

  再来看看十分经典的Swap 的例子

  

    public class Swapper        private static void Swap<T>(ref T o  ref T o )                T temp = o ;          o  = o ;          o  = temp;         

  Swap 泛型方法就像是封装了N个非泛型的Swap方法 如Swap(ref int o ref int o ) Swap(ref string o ref string o )等等 在类型推断特性的支持下 您甚至可以像使用非泛型方法一样来使用泛型方法 参数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 并且没有返回值的方法 任何符合上述约束的方法 在FooDelegate中一视同仁 如 AddToList实例方法与PrintIfContains静态方法除了参数列表与返回值相同外

   内部实现完全不同 但是它们却可以添加到同一个委托链表中 也就是说 同一个委托 可以定义并调用不同的方法(约束相同而实现不同)

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

  多态小结

  我们通常所讨论的多态 就是指子类对父类方法的重写(虚方法)或覆蓋(非虚方法) 这样的理解未免过于狭隘 NET强大的特性能够实现其他语言中无法实现的多态性 如本文所列举的泛型和委托 您是否认同笔者的观点呢?如果认同 您是否还能举出其他的例子呢?

cha138/Article/program/net/201311/11780

相关参考

浅谈锚头鳋病防治

锚头鳋病(别名:针虫病、蓑衣病、铁锚虫病)1、病源:主要有四种:寄生于鲢、鳙和鳊鱼体表、口腔的多态锚头鳋,寄生于草鱼鳞片下的草鱼锚头鳋,寄生于鳃弧上的四球锚头鳋,寄生于鲤、鲫、鲢、鳙、青、乌鳢和鳗鲡等

知识大全 ASP.NET中不定级动态菜单的实现

ASP.NET中不定级动态菜单的实现  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!我们平时IEWe

知识大全 浅谈.Net中的对象相等

浅谈.Net中的对象相等  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Net中对象相等比较是看

知识大全 浅谈.NET重写URL

浅谈.NET重写URL  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  具体使用方法  首先nfi

知识大全 浅谈 .NET 里的MTS

浅谈.NET里的MTS  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!事务处理模式是为参与事务处理的

知识大全 浅谈ASP.NET报表控件

浅谈ASP.NET报表控件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  项目中有报表图形化的需

知识大全 浅谈.NET中加密和解密的实现方法

浅谈.NET中加密和解密的实现方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  NET将原来独

知识大全 浅谈ASP.NET内部机制(三)

浅谈ASP.NET内部机制(三)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  大家已经在知道在

知识大全 浅谈ASP.NET的内部机制(一)

浅谈ASP.NET的内部机制(一)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  前言当一个Ht

知识大全 浅谈ASP.NET的内部机制(二)

浅谈ASP.NET的内部机制(二)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  上次已经说到了