C#复习⑥

2016年6月19日

23:46

Main Interfaces & Delegates 接口和委托

1.接口基本语法

public interface IList : ICollection, IEnumerable {

int Add (object value);        // methods

bool Contains (object value);

...

bool IsReadOnly { get; }        // property

...

object        this [int index] { get; set; }        // indexer

}

接口相当于一个抽象类,只有签名没有实现;

Interface = purely abstract class; only signatures, no implementation.

接口可能包含方法、属性、索引器、时间(没有字段、没有常量、没有构造函数、没有析构函数、没有运算符、没有级联类型)

May contain methods, properties, indexers and events
(no fields, constants, constructors, destructors, operators, nested types).

接口成员隐藏着abstract或者virtual关键字

Interface members are implicitly public abstract (virtual).

接口成员不能为static

Interface members must not be static.

接口可以继承自其他的接口

Interfaces can inherit from other interfaces.

类和结构体可以实现多个接口

Classes and structs may implement multiple interfaces.

2.Implemented by Classes and Structs类、结构体实现接口

class MyClass : MyBaseClass, IList, ISerializable {

public int Add (object value) {...}

public bool Contains (object value) {...}

...

public bool IsReadOnly { get {...} }

...

public object this [int index] { get {...} set {...} }

}

一个类只能继承一个类但是可以实现多个接口

A class can inherit from a single base class, but can implement multiple interfaces.

一个结构体不能继承自其他的类或者结构体但是可以实现多个接口

A struct cannot inherit from any type, but can implement multiple interfaces.

接口中的每一个成员必须被实现

Every interface member (method, property, indexer) must be implemented or inherited from a base class.

实现接口内部包含的方法不必要声明为override

Implemented interface methods need not be declared as override.

实现接口内部包含的方法可以声明为abstract抽象方法

Implemented interface methods can be declared as abstract (i.e. an interface can be implemented by an abstract class).

如果子类MyClass中Add方法应该被重写那么应当声明为virtual尽管在IList中已经隐藏着virtual关键字

If Add() should be overridden in a subclasses of MyClass it must be declared as virtual (although Add() is already implicitly virtual in IList).

3.Working with Interfaces

举例:

interface ISimpleReader {

int Read();

}

interface IReader : ISimpleReader {

void Open(string name);

void Close();

}

class Terminal : ISimpleReader {

public int Read() { ... }

}

class File : IReader {

public int Read() { ... }

public void Open(string name) { ... }

public void Close() { ... }

}

ISimpleReader sr = null;        // null can be assigned to any variable of an interface type

sr = new Terminal();

sr = new File();

IReader r = new File();

sr = r;

4.Delegate委托

声明委托:delegate void Notifier (string sender);//组成:普通函数的签名加上关键字delegate

声明委托变量:Notifier greeting;

将方法分配给委托变量:

void SayHello(string sender) {

Console.WriteLine("Hello from " + sender);

}

greetings = new Notifier(SayHello);        // or just:

greetings = SayHello; // since C# 2.0

调用委托变量:greeting("John");

5.不同的方法分配

每一个方法可以分配至一个委托变量:

void SayGoodBye(string sender) {

Console.WriteLine("Good bye from " + sender);

}

greetings = SayGoodBye;

greetings("John");        // SayGoodBye("John") => "Good bye from John"

注意:委托变量可以被赋予null值;

如果委托变量为null,那么该委托变量不能被调用,否则产生异常;

委托变量其实是一种类,可以存储的数据结构中,可以传递参数

Creating a Delegate Value:

m = obj.Method; // or in long form: m = new DelegateType (obj.Method);

一个委托变量可以存储一个方法以及它的接收器,不是参数:greetings = myObj.SayHello;

如果obj是this那么可以省略:greetings = SayHello;

方法可以是静态的,但是这样需要用类名来进行实例,greetings = MyClass.StaticSayHello;

方法不能是抽象的,但是可以使virtual,override,new

方法的签名必须和委托的签名相匹配

有相同的参数个数;

有相同的参数类型,包括返回类型;

有相同的参数修饰符(value,ref/out)

6.多播委托Multicast Delegates

一个委托变量可以同时掌握着多个方法;

Notifier greetings;

greetings = SayHello;

greetings += SayGoodBye;

greetings("John");        // "Hello from John"

// "Good bye from John"

greetings -= SayHello;

greetings("John");        // "Good bye from John"

注意:

如果多播委托是一个函数,那么返回值是最后一个被调用的那个方法;

如果多播委托是out修饰的参数类型,那么参数应该是最后一个调用的返回.ref修饰的参数类型应该从所用的方法一直传递下去。

Java中实现上述功能:

7.事件

事件就是特殊的委托域;

事件与委托变量不同的地方:

只有声明事件的类才能够解除事件;

其他类只能改变事件域只能使用+= 或者 -=

class Model {

public event Notifier notifyViews;

public void Change() { ... notifyViews("Model"); }

}

class View {

public View(Model m) { m.notifyViews += Update; }

void Update(string sender) { Console.WriteLine(sender + " was changed"); }

}

class Test {

static void Main() {

Model model = new Model();

new View(model); new View(model); ...

model.Change();

}

}

事件在.NET Library中如何处理

举例:

public delegate void KeyEventHandler (object sender, KeyEventArgs e);

public class KeyEventArgs : EventArgs {

public virtual        bool        Alt { get {...} }        // true if Alt key was pressed

public virtual        bool        Shift { get {...} }        // true if Shift key was pressed

public         bool        Control { get {...} }        // true if Ctrl key was pressed

public         bool        Handled { get{...} set {...} }        // indicates if event was already handled

public         int         KeyValue { get {...} }        // the typed key code

...

}

class MyKeyEventSource {

public event KeyEventHandler KeyDown;

...

KeyDown(this, new KeyEventArgs(...));

...

}

class MyKeyListener {

public MyKeyListener(...) { keySource.KeyDown += HandleKey;}

void HandleKey (object sender, KeyEventArgs e) {...}

} 
时间: 2024-10-29 04:06:48

C#复习⑥的相关文章

C++基础复习

一. C++与C的比较: C语言是一个结构化语言,它的重点在于算法和数据结构,C语言的设计首先要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到的输出(或实现过程(事物)控制). C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事物)控制. 所以C语言和C++的最大区别在于它们解决问题的思想不同,一个面向过程一个面向对象. C++对C的"增强",表现在六个方面: 1.类型检测更为严格. 2.

大量逻辑判断优化的思路——责任链模式复习总结及其和状态模式对比

俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的总结知识点如下: 责任链模式概念和例子 使用的条件 和状态模式的比较分析 责任链的优缺点 纯的责任链和不纯的责任链 javax.servlet.Filter#doFilter()方法源码分析 基于AOP思想,模拟一个拦截器 前面说了一个状态模式,总结过程中发现和这个责任链的使用场景很类似,都是为了解耦大量复杂业务逻辑判断的,那么他们有什么不同呢?回忆状态模式——状态模式允许通过改变对象的内部状态而改变对象自身的行为,这个对象

算法分析与设计复习

算法分析与设计复习 2016年初,研一上学期期末考试前,复习并总结算法分析与设计科目的内容.复习过程参照<算法导论>中文第2版,同时参照PPT,章节划分根据PPT内容 概要: 第一章 概述 第二章 插入排序&分治策略 第三章 复杂度分析 第四章 堆与堆排序 第五章 快速排序 第六章 线性时间排序 第一章 概述 算法的应用范围 算法在诸如生物等诸多领域有其应用 算法的意义 算法在很多情况下让不可能完成的事情变成了可能,让处理的很慢的过程变快. 一个铺垫 一串不全为0的数,怎么取能拿到一段

复习PHP-语言参考-预定义接口

1.Traversable 他是一个遍历接口规范 注意:发现一个有用的函数get_declared_classes,可以以数组形式显示当前脚本下所有已经定义的类名 2.Iterator Iterator迭代器继承自Traversable,是一种遍历对象内容的对象. 你可以自己写一个子类继承自它,并写上具体遍历的方法. Iterator包含:current(返回当前元素),key(当前键),next(下一个元素),rewind(返回至初始元素),valid(检测当前元素是否存在)五种方法. 3.I

underscore 复习 对象函数 篇章

_.partial = function(func) { var boundArgs = slice.call(arguments, 1); var bound = function() { var position = 0, length = boundArgs.length; var args = Array(length); for (var i = 0; i < length; i++) { args[i] = boundArgs[i] === _ ? arguments[positio

数据结构复习之C语言指针与结构体

数据结构指针复习: #include <stdio.h> void main() { int a[5] = {8, 2, 3, 4, 5}; // a[3] == *(3+a) printf("%d\n", *(3+a)); // a[3] 4 printf("*a其实就是a[0]: %d\n", *a); // 8 // 地址是连续的 printf("%p\n", a+1); printf("%p\n", a+2

jsp servlet基础复习 Part1

jsp和servlet的一些基础知识整理,用于备忘. 一.jsp与servlet的基本关系 1.jsp-->web容器-->servlet-->加载进容器的虚拟机执行-->输出执行结果给浏览器端 在这个过程,所有位于<%%>之外的值,都被认为是out.println()中的内容进行直接输出.详细理解看代码 <html> <% //例子说明:servlet和jsp的关系 boolean b = false; if(b){ %> 这里是内容一 <

shell脚本复习

最近公司工作量很小,就复习复习,看起了马哥的视频,感觉马哥讲课讲得特别细.这才是深入到系统的讲解,补充了很多我之前只是了解到皮毛的东西. shell编程:弱类型编程语言 强:变量在使用前,必须事先声明,甚至还需要初始化 NULL: 弱:变量用时声明,甚至不区分类型: 变量赋值:VAR_NAME=VALUE 编译器,解释器 编程语言:机器语言.汇编语言.高级语言 静态语言:编译型语言 强类型(变量) 关键字: 事先转换成可执行格式 C.  C++.JAVA.C# 动态语言:解释型语言 on the

[Java面试一]面试复习大纲.

一.Java基础部分 (搞定所有技术之后才考虑复习的技术点) 1.数组中的排序问题(笔试或者机试,前者可能性更大) 2.面向对象的理解 3.集合相关的问题,比如hashmap跟hashtable的区别.搞清楚每个集合对象的特性就欧了. 4.多线程启动方式,以及产生死锁的原因和解决办法[多线程问题不是很常问,有精力就复习这块内容] 5.IO流,了解常见的几个流对象以及基本的流操作即可,被机试的可能性比较小. 二.Web基础 (1年工作经验者需要重点复习的技术点) 1.http协议(定义.常见的请求

c#复习-2

输入三个学生的信息学号.姓名.分数从大到小排序 1 using System; 2 using System.Collections; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Text; 6 7 namespace 复习CS 8 { 9 class Program 10 { 11 struct Student 12 { 13 public int num; 14 public string C