美文网首页C#
面向对象(十九)-扩展方法

面向对象(十九)-扩展方法

作者: 元宇宙协会 | 来源:发表于2017-12-10 21:58 被阅读27次

1 简介:

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

2.定于扩展方法

Personl类的定义

public class Person
    {
        public string name;

        public override string ToString()
        {
            return this.name;
        }
    }

为Person类扩展方法

public static class MethedExt
    {
        public static void sayHellow(this Person obj)
        {
            Console.WriteLine("Say Hellow" + obj.name);
        }
    }

扩展方法被定义为静态方法,但它们是通过实例方法语法进行调用的。 它们的第一个参数指定该方法作用于哪个类型,并且该参数以 this 修饰符为前缀。

3. 调用扩展方法

            Person p1 = new Person();
            p1.name = "asdasd";
            p1.sayHellow();

在代码中,可以使用实例方法语法调用该扩展方法。 但是,编译器生成的中间语言 (IL) 会将代码转换为对静态方法的调用。 因此,并未真正违反封装原则。 实际上,扩展方法无法访问它们所扩展的类型中的私有变量。

定义和调用扩展方法注意点

  • 定义一个静态类以包含扩展方法。

  • 将该扩展方法实现为静态方法,并使其至少具有与包含类相同的可见性。

  • 该方法的第一个参数指定方法所操作的类型;该参数必须以 this修饰符开头。

  • 在调用代码中,添加一条 using指令以指定包含扩展方法类的命名空间。

  • 按照与调用类型上的实例方法一样的方式调用扩展方法。

4 为接口添加扩展方法

接口定义

  public interface Interface1
    {
        void test1();

    }

为接口扩展方法

public static class MethedExt
    {
        public static void test2(this Interface1 iter)
        {
            Console.WriteLine("test2");
        }
     }

实现接口中的方法

public class Person : Interface1
    {
        public string name;
        private int age;

        public override string ToString()
        {
            return this.name;
        }

        public void test1()
        {

        }
    }

调用扩展的接口方法

static void Main(string[] args)
        {
            Person p1 = new Person();
            p1.name = "asdasd";
            p1.test2();
        }

5、使用注意

可以使用扩展方法来扩展类或接口,但不能重写扩展方法。
与接口或类方法具有相同名称和签名的扩展方法永远不会被调用。
编译时,扩展方法的优先级总是比类型本身中定义的实例方法低。 换句话说,如果某个类型具有一个名为 SayHellow()的方法,而你有一个具有相同签名的扩展方法,则编译器总是绑定到该实例方法。 当编译器遇到方法调用时,它首先在该类型的实例方法中寻找匹配的方法。 如果未找到任何匹配方法,编译器将搜索为该类型定义的任何扩展方法,并且绑定到它找到的第一个扩展方法。

牢记一点: 如果扩展方法与该类型中定义的方法具有相同的签名,则扩展方法永远不会被调用。

6、一点建议:

通常,建议你只在不得已的情况下才实现扩展方法,并谨慎地实现。 只要有可能,必须扩展现有类型的客户端代码都应该通过创建从现有类型派生的新类型来达到这一目的。
在使用扩展方法来扩展你无法更改其源代码的类型时,你需要承受该类型实现中的更改会导致扩展方法失效的风险。

作者:silence_k
链接:http://www.jianshu.com/p/247ab6b373a4
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

相关文章

  • 面向对象(十九)-扩展方法

    1 简介: 扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。 扩...

  • 20170610基础知识-面向对象

    Object Oriented ProgrammingOOP:面向对象,使用对象、类、继承、封装、属性、方法、扩展...

  • Python--面向对象

    面向对象(Object Oriented) 是软件开发方法。 面向对象的概念和应用已超越了程序设计和软件开发,扩展...

  • 第七篇:Kotlin之面向对象升级(一)

    上篇:Kotlin之面向对象简单 本章节来介绍Kotlin面向对象的高级部分: 一. 扩展:kotlin的扩展是一...

  • 少儿编程很好学之从0开始学python-8.3面向对象实战

    面向对象是目前主流的编程方法。通过面向对象,可以将系统有效的隔离,使得程序容易维护和扩展。在这节课里,我们会先开发...

  • Java 面试基础知识(一)

    1.面向对象与面向过程的区别 面向过程:性能比面向对象高,但是维护性、扩展性和复用性没有面向对象好。 面向对象:维...

  • Java 面试基础知识(一)

    1.面向对象与面向过程的区别 面向过程:性能比面向对象高,但是维护性、扩展性和复用性没有面向对象好。 面向对象:维...

  • iOS运行时RunTime详解

    Objective-C语言是扩展于C语言的一种面向对象的编程语言,然而其方法的调用方式又和大多数面向对象语言大有不...

  • 7.面向对象编程

    Swift 面向对象编程 面向对象的三大特性 继承封装多态 基本单元 枚举结构体类协议扩展 面向对象概述 从整体的...

  • 面向对象

    面向对象方法概论 对象、结构 概念呢 特征 1.1 什么是面向对象 面向对象方法的基本思想 对象 属性-静态特征 ...

网友评论

    本文标题:面向对象(十九)-扩展方法

    本文链接:https://www.haomeiwen.com/subject/rfqbixtx.html