1.扩展方法2.接口的隐式实现和显式实现

1.扩展方法:必须写在一个静态类里面,具体见代码:

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

namespace
ConsoleApplication1

{

    class
Program

    {

        static
void Main(string[] args)

        {

            Student s = new
Student();

            s.HelloWorld("HelloWorld!");

        }

    }

    

    public
class Student

    {

        void
GetName()

        {

            Console.WriteLine("Tom");

            Console.ReadKey();

        }

    }

    public
static class StudentEx

    {

        public
static void HelloWorld(this
Student self,string
str)

        {

            Console.WriteLine(str);

            Console.ReadKey();

        }

    }

}

在这个例子中,扩展方法写在了StudentEx中,因为HelloWorld这个函数的第一个参数是“this Student
self”,即对应的类型是Student,所以在Main函数中才可以对Student实例化后调用HelloWorld方法。如果把HelloWorld的第一个参数类型改为“this
Object self”,由于object是所有类的父类,所以所有类的方法都可以使用这个方法。

注:为什么可以这样做,主要是来源于静态方法和非静态方法的区别,非静态方法在编译的时候,编译器会给它加一个参数作为第一个参数,这个参数就是this,这也正是我们在函数体内可以使用this的原因,而静态方法并不会加上this,所以它没办法通过实例化后的对象来调用。扩展方法正是给静态方法加了一个this的参数,使得它可以通过实例化访问。

2.接口的隐式实现和显示实现的区别。

在这篇博文里面说的很清楚,参见http://www.cnblogs.com/chenxizhang/archive/2008/08/22/1274265.html

自己总结一下:通过显式实现的好处是,不把具体类暴露给用户,只暴露接口。

1.扩展方法2.接口的隐式实现和显式实现,布布扣,bubuko.com

时间: 2024-10-11 00:08:39

1.扩展方法2.接口的隐式实现和显式实现的相关文章

iOS Core Animation Advanced Techniques(四):隐式动画和显式动画

隐式动画 按照我的意思去做,而不是我说的. -- 埃德娜,辛普森 我们在第一部分讨论了Core Animation除了动画之外可以做到的任何事情.但是动画师Core Animation库一个非常显著的特性.这一章我们来看看它是怎么做到的.具体来说,我们先来讨论框架自动完成的隐式动画(除非你明确禁用了这个功能). 事务 Core Animation基于一个假设,说屏幕上的任何东西都可以(或者可能)做动画.动画并不需要你在Core Animation中手动打开,相反需要明确地关闭,否则他会一直存在.

无法从使用方法中推导出方法... 的类型实參,请尝试显式指定类型实參

这个问题,网上基本没得什么解决方法,事实上都是编程习惯造成的,在程序的世界里,用户自己命名必须规范,唯一,与系统框架提供的对象名称分开.否则将会产生非常多,标题问题.以上问题,非常多都是没有确切 指定,多空间命名的时候,建立了多个一样的对象名,而在统一地方使用对象,没有明白指定,哪个空间对象,就会报以上错误:比如 空间一 using System; namespase Models { public class orderby {} } 空间二 using System; namespase B

CoreAnimation4-隐式动画和显式动画

事务 Core Animation基于一个假设,说屏幕上的任何东西都可以(或者可能)做动画.动画并不需要你在Core Animation中手动打开,相反需要明确地关闭,否则他会一直存在. 当你改变CALayer的一个可做动画的属性,它并不能立刻在屏幕上体现出来.相反,它是从先前的值平滑过渡到新的值.这一切都是默认的行为,你不需要做额外的操作. 这看起来这太棒了,似乎不太真实,我们来用一个demo解释一下:首先和第一章“图层树”一样创建一个蓝色的方块,然后添加一个按钮,随机改变它的颜色.代码见清单

C++中函数模板,显式具体化,显式实例化:

函数模板 形如: template<typename T>  //没有分号 void func(T &a,T &b); 称为函数模板,其中,template和typename为关键字,typename可以用class来替代.T(可以用其他的名称)表示一种泛型,既可以表示int型,也可以表示double或其他类型,将它想象成C++里面的数据类型的集合. 也就是说: void func(T &a,T &b)= void func(int &a,int &am

C++学习笔记36 模版的显式具体化和显式实例化

C++的模版有时候很可能无法处理某些类型. 例如: #include <iostream> using namespace std; class man{ private: string name; int data; public: man(string s,int i):name(s),data(i){ } void show()const{ cout<<"this name is "<<name<<" ,data=&quo

使用扩展方法增强接口功能

扩展方法其实就是一个静态方法,只不过微软封装成了语法糖 从MSIL中我们可以看出,这段代码编译后和调用静态方法没有任何的差别(从call指令来看,这是在调用一个静态方法). 从这里可以知道扩展方法即可以使用实例调用的方式也可以直接使用静态类调用的方式: str.GetValueByName("Length"); PropertyExtension.GetValueByName(str,"Length"); 1 using System; 2 namespace Wi

JDK并发包温故知新系列(五)—— 显式锁与显式条件

显式锁-Lock与ReadWriteLockJDK针对Lock的主要实现是ReentrantLock,ReadWriteLock实现是ReentrantReadWriteLock.本文主要介绍ReentrantLock. ReentrantReadWriteLock两把锁共享一个等待队列,两把锁的状态都由一个原子变量表示,特有的获取锁和释放锁逻辑. ReentrantReadWriteLock的基本原理:读锁的获取,只要求写锁没有被线程持有就可以获取,检查等待队列,逐个唤醒等待读锁线程,遇到等待

隐式游标和显式游标

隐式游标的例子

隐式意图和显式意图

  隐式意图: 不知道将要跳转的是哪一个类, 无法引用到类. 只知道其动作(action), 类型(mimeType)和附加信息. * 原理:开启目标activity,系统去清单文件匹配,如果匹配成功则开启activity:如果匹配失败则抛出没有找到这个activity的异常 * 缺点:效率低,代码数据复杂 * 优点:可以开启自己和其他应用程序里的activity界面 * 应用场景:用于开启系统的activity界面 // 以下是打开系统中浏览器页面. Intent intent = new I