zoukankan      html  css  js  c++  java
  • 扩展方法

        这篇谈谈扩展方法,顾名思义,扩展即对某一个事物进行增加,或者增加一些功能。那扩展方法呢?比如我们现在有一个类A,但是这个类就标记成了sealed,我们不能继承这个类,又或者我们现在手上有一个dll,可以是买来的,可以是任何途径你得到的,但是你发现这个dll中有一个些类的功能并不是你想要的,或者没有你想要的,但是你却加不了任何方法。这个时候就可以用扩展方法。扩展方法即扩展我们想要扩展功能但却不能继承,不能修改源代码的类。

        首先,扩展framerwork的string类,因为string类是sealed类

        首先是扩展类

    namespace ExtensionMethod
    {
       public static class ExtensionString
        {
           public static void Extension(this string s)
           {
               Console.WriteLine("String is Extensioned");
           }
        }
    }
    

    扩展类是静态的,扩展方法也是静态的,方法的参数名称是要扩展的类型,为了区分参数,和扩展的类型,必须在要扩展的类型前加this关键字。

     调用代码

     static void Main(string[] args)
            {
                string s = "Hello World";
                s.Extension();
                Console.Read();
            }
    

    下面我们在扩展类里面加上一个重载方法

    public static class ExtensionString
        {
           public static void Extension(this string s)
           {
               Console.WriteLine("String is Extensioned");
           }
    
           public static void Extension(this string s, string name)
           {
               Console.WriteLine("Hello:"+name);
           }
        }
    

    加上一个有参数的,name。

    调用代码

     static void Main(string[] args)
            {
                string s = "Hello World";
                s.Extension();
                s.Extension("Edrick");
                Console.Read();
            }
    

    下面我们看看扩展方法在我们无法获取源代码的dll类中的扩展

    新建项目,新建类Person,类里面没有任何代码

    namespace Edrick.Liu.People
    {
       public class Perosn
        {
           
        }
    }
    

    添加引用,添加我们来是扩展类

    namespace ExtensionMethod
    {
       public static class PersonExtension
        {
           public static void PrPerson(this Perosn p, string firstName,string lastName)
           {
               Console.WriteLine(firstName+","+lastName);
           }
        }
    }
    

    调用类

        class Program
        {
            static void Main(string[] args)
            {
                //string s = "Hello World";
                //s.Extension();
                //s.Extension("Edrick");
    
                Perosn p = new Perosn();
                p.PrPerson("Edrick", "Liu");
                Console.Read();
            }
        }
    

    我们新建一个类Student继承Person,

    namespace ExtensionMethod
    {
       public class Student:Perosn
        {
           public Student()
           {
               
           }
        }
    }
    

    我们在调用Student的时候可以访问到Person的扩展方法

            static void Main(string[] args)
            {
                //string s = "Hello World";
                ////s.Extension();
                ////s.Extension("Edrick");
    
                //ExtensionString.Extension(s);
    
                //Perosn p = new Perosn();
                //p.PrPerson("Edrick", "Liu");
                //Console.Read();
    
                Student student = new Student();
                student.PrPerson("Edrick", "Liu");
                Console.Read();
            }
    

    说明子类可以访问到父类的扩展方法。

    个人对扩展方法的建议

    1,它反应不了类的真实意图,即一个类想要完成的某个对象功能被拆散分布在多个类文件中,我们在调用扩展类的时候其实是调用的静态类,只是把扩展的类型当做参数传入静态方法中ExtensionString.Extension(s);但是我们本想string完成的功能却在扩展类的代码中。所以,我们在想扩展密封类的时候扩展方法可以起到很好的作用,但是如果类可以继承,个人觉得最好还是继承类。

    2,在维护性会有一定的影响,但是不大。

  • 相关阅读:
    UVA 11925 Generating Permutations 生成排列 (序列)
    UVA 1611 Crane 起重机 (子问题)
    UVA 11572 Unique snowflakes (滑窗)
    UVA 177 PaperFolding 折纸痕 (分形,递归)
    UVA 11491 Erasing and Winning 奖品的价值 (贪心)
    UVA1610 PartyGame 聚会游戏(细节题)
    UVA 1149 Bin Packing 装箱(贪心)
    topcpder SRM 664 div2 A,B,C BearCheats , BearPlays equalPiles , BearSorts (映射)
    UVA 1442 Cave 洞穴 (贪心+扫描)
    UVA 1609 Foul Play 不公平竞赛 (构(luan)造(gao)+递归)
  • 原文地址:https://www.cnblogs.com/ColeLiu/p/2214530.html
Copyright © 2011-2022 走看看