接口委托事件异常处
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
口事件声明、接口索引器声明。
整理ppt
接口中的方法、属性、事件和索引器的声明格式 和类中的声明格式的区别在于:接口中上述成员 声明不包含实现体。
接口的显示基接口必须至少具有与该接口本身相 同的可访问性,例如,接口是internal,那么基接 口不能是protected或private。
接口不能直接或间接继承自身,否则会发生编译 时错误。
{ ……//成员定义部分
} 基类名在接口名之前,基类至多只能有一个, 但可以继承零个或多个接口。
整理ppt
注意: • 一个类实现一个接口时,这个类就必须实现整个接口,也
就是说,这个类不能选择实现接口的一部分。 • 一个类可以实现多个接口。要实现多个接口时,在上述语
句的接口名列表中,接口之间用逗号分隔。 • 一个类可以继承一个基类,并同时实现一个或多个接口,
class Mapping:IInterface1,IInterface2 { public void IInterface1.Play(){} public void IInterface2.Play(){} }
记住:一旦成员被覆盖后,所有对其的访 问都被覆盖以后的成员“拦截”了。
class E
{ void Test(ID d) { d.H(1); ((IA)d).H(1);
调用IB.H 调用IA.H 调用IB.H
((IB)d).H(1);
调用IB.H
((IC)d).H(1);
}}
整理ppt
3.接口成员的完全限定名 接口成员也可以用它的完全限定名(full qualified name)
{public void Play()
{}
接口IInterface1和IInterface2的方法Play都映射到了类Mapping
}
中的Play方法。也可以分别用显式接口成员分别实现这两个方法。
整理ppt
interface IInterface1 {void Play();}
interface IInterface2 {void Play();}
•
string this [int index] {get;set}//定义接口索引器
•}
“:”表示继承,这和类的继承一样,但可以多继承
接口中的成员是一种没有实现体的抽象成员,他们 没有使用abstract关键字修饰,这是一个约定,因 为接口成员一定是抽象的。
整理ppt
2、接口的继承 • 接口允许多重继承,一个接口可以从多个基接口继承,并包含这些基
自身定义的成员。接口成员可以是方法、 属性、索引和事件,但不能有常数、运算 符、构造函数、析构函数、类型和静态成 员。 因为接口只具有“被继承”的特性,所以默 认时,所有接口成员只具有public特性,接 口成员的声明中不能含有任何其他修饰符。
整理ppt
example2
Interface IA
{
void compute(); //方法成员的声明
第五章 接口、委托、事件和异常
整理ppt
• 5.1、接口 • 5.2、委托 • 5.3、事件 • 5.4、异常处理
整理ppt
5.1 接口
• 接口是抽象成员的集合,这些抽象成员 可以是抽象方法、属性、索引器、事件等, 接口是实现多继承的工具。
• 实际上,接口是一些实现特定功能的抽 象成员的集合。
• 一个类可以继承多个接口,从而获得多 个行为的描述,将他们组合成新的功能并 在类中实现。
接口方法隐含的访问控制符是public的。
整理ppt
• 例:
• public interface IModelable: ICollection, IEnumerable
•{
•
void Pattern Name(string s);//定义接口方法
•
int Count {get;}
//定义接口属性
整理ppt
• 如果一个类实现了两个或两个以上名字、类型和参 数类型都相同的接口,那么类中的一个成员就可能 实现所有这些接口成员。
• 如:
interface IInterface1
{void Play();}
interface IInterface2
{void Play();}
class Mapping:IInterface1,IInterface2
整理ppt
e5_1.cs
• using System;
• public interface INextNum
•{
• int getNext(); 一个数字
//返回数字序列中的下
• void reset();
//重新开始
• void setStart(int x); //设置初始值
•}
整理ppt
• class MySeries : INextNum //实现接口INextNum
MailSet的完全限定名是:IMailBox.MailSet
整理ppt
5.1.3 接口的实现 接口的定义不包括方法的实现,接口可以由类
来实现,也可以由结构来实现。 所谓实现接口,就是继承他们并且在被继承方
法、属性、索引器和事件中填入体现所需行为的 代码。
用类来实现接口的格式: class 类名:[基类],接口,接口,……,接口
•}
• public void reset()//实现接口INextNum中的方法reset()
•{
•
start = 0;
•
number = 0;
•}
• public void setStart(int x)//实现接口INextNum中的方法setrestart()
•{
•
start = x;
•
number = x;
• }}
整理ppt
E5_2.cs
• class MySequence : INextNum
•{
• int start;
• int number;
• public MySequence()
•{
•
start = 0;
•
number = 0;
•}
• public int getNext()
•{
•
number += 3;
现继承;而接口继承只是说明继承。也就 是说,派生类可以继承基类的方法实现, 而派生类的接口只继承了父接口的成员方 法说明,而没有继承父接口的实现。 • 其次,C#中类继承只允许单继承,但是接 口继承允许多继承,一个子接口可以有多 个父接口。
整理ppt
5.1.2 接口的成员 1、接口的成员定义 接口成员包括从基接口继承的成员以及接口
这时,需将各个接口用逗号分开,并且基类名必须放在被 逗号分隔的接口列表名的首位。 • 在类中实现的接口成员(方法、属性、索引和事件)必须 定义为public。因为接口中声明的成员默认类型是public, 所以在类中实现的接口成员的类型也必须是public。 • 在类中实现的成员的数据类型也必须和它们在接口中声明 的类型完全一样。
• class LS
•{
• void Test(IListSeries ils)
•{
•பைடு நூலகம்
pute(1); //错误,产生二义性
•
pute(1.0);//正确,类型一致
•
((ISeries)ils).Compute (1);//正确,加了强制转换符
•
((IList)ils).Compute(1);//正确
整理ppt
• using System;
• interface ISeries
•{
• void Compute(double i);
•}
• interface Ilist
•{
• void Compute(int i);
•}
• interface IListSeries : ISeries, IList { }
来引用。 完全限定名:接口名加上小圆点“.”,后再跟上成员名。 成员的完全限定名将引用声明该成员的接口。 如: Interface IHandle {
void Write(); } Interface IMailBox:IHandle {
void MailSet(); } 则Write的完全限定名是:IHandle.Write
{ void SetText (string text); } Interface IListBox:IHandle
{ void SetItems (string[] item); } Interface IComboBox: ITextBox, IListbox{}
整理ppt
注意,接口和类的继承不同: • 首先,类继承不仅说明继承,而且也是实
•}
•}
整理ppt
• 接口的多重访问也会带来成员访问上的问题,如example4
interface IA
{ void H(int i);}
interface IB : IA
{ new void H(int i);}
interface IC : IA { void L();}
interface ID : IB, IC { }
•{
• int start;
• int number;
• public MySeries() //构造函数
•{
•
start = 0;
•
number = 0;
•}
• public int getNext()//实现接口INextNum中的方法getNext()
•{
•
number += 2;
•
return number;
下面给出接口映射的过程,假设类C实现了一个接口IA, Menber是接口IA中一个成员,Menber的映射过程时这样的。 ①如果C中存在一个显式接口成员执行体,该执行体与接口 IA及其成员Menber相对应,则由它来实现Menber成员。 ②如果条件①不满足,且C中存在一个非静态的公有成员, 该成员与接口成员Menber相对应,则由它来实现Menber成 员。 ③如果上述条件仍不满足,则在C说明的基类类表中寻找一 个基类D,用D来代替C。 ④重复步骤① ~ ③,遍历C的所有直接基类和非直接基类, 直到找到一个满足条件的类的成员。 ⑤如果仍然没有找到,则报告出错。
整理ppt
1、类实现接口 (1)、一个类实现一个接口e5_1.cs (2)、多个类实现一个接口e5_2.cs (3)、一个类实现多个接口e5_3.cs
接口可以实现多重继承,即可以在同一 个类中同时实现多个接口。格式上即将要 实现的多个接口用逗号分开。一个类实现 多个接口,要求它必须实现这些接口的所 有成员。
接口继承树上的所有基接口。 • 当接口从多个接口中继承时,用冒号“:”后跟被继承的接口名字,
多个接口名之间用“,”分割。 • 接口不允许直接或间接从自身继承。 example1 using System; Interface IHandle
{ void Compute(); } Interface ITextBox :IHandle
整理ppt
5.1.1 定义接口 1、接口的声明
【格式】: • [特性][ 接口修饰符] interface 接口名:[基接口列表] •{ • 接口体 •} • 【说明】: 接口修饰符:new、public、protected、internal、private。 把出现在基接口列表中的基接口称为显示基接口。 接口体的声明可以有:接口方法声明、接口属性声明、接
int next
//属性成员的声明
{ get;
set;
}
int this [int index]//索引器的声明
{
get;
}
event Press MyEvent; // 事件成员的声明
}
整理ppt
2、接口成员的访问 接口成员是通过I.M形式的成员访问表达式和I[A]
形式的索引器访问表达式来访问的,其中I是接口 类型,M是该接口类型的方法、属性或事件,A是 对应的索引器参数类表。 对接口方法的调用和采用索引器访问的规则和类 中的情况是相同的。 如果底层成员的命名与继承而来的高层成员一致, 那么底层成员将覆盖同名的高层成员。 但由于接口支持多继承,在多继承中,如果两个 父接口含有同名的成员,这就产生了二义性,这 时需要进行显示的声明。example3
•
return number;
•}
• public void reset()
•{
•
start = 0;
•
number = 0;
•}
• public void setStart(int x)
•{
•
start = x;
•
number = x;
•}
•}
整理ppt
2、接口映射
类必须为在基类中列出的所有接口的成员提供具体的实 现。在类中定位接口成员的实现称之为接口映射(interface mapping)。
整理ppt
接口中的方法、属性、事件和索引器的声明格式 和类中的声明格式的区别在于:接口中上述成员 声明不包含实现体。
接口的显示基接口必须至少具有与该接口本身相 同的可访问性,例如,接口是internal,那么基接 口不能是protected或private。
接口不能直接或间接继承自身,否则会发生编译 时错误。
{ ……//成员定义部分
} 基类名在接口名之前,基类至多只能有一个, 但可以继承零个或多个接口。
整理ppt
注意: • 一个类实现一个接口时,这个类就必须实现整个接口,也
就是说,这个类不能选择实现接口的一部分。 • 一个类可以实现多个接口。要实现多个接口时,在上述语
句的接口名列表中,接口之间用逗号分隔。 • 一个类可以继承一个基类,并同时实现一个或多个接口,
class Mapping:IInterface1,IInterface2 { public void IInterface1.Play(){} public void IInterface2.Play(){} }
记住:一旦成员被覆盖后,所有对其的访 问都被覆盖以后的成员“拦截”了。
class E
{ void Test(ID d) { d.H(1); ((IA)d).H(1);
调用IB.H 调用IA.H 调用IB.H
((IB)d).H(1);
调用IB.H
((IC)d).H(1);
}}
整理ppt
3.接口成员的完全限定名 接口成员也可以用它的完全限定名(full qualified name)
{public void Play()
{}
接口IInterface1和IInterface2的方法Play都映射到了类Mapping
}
中的Play方法。也可以分别用显式接口成员分别实现这两个方法。
整理ppt
interface IInterface1 {void Play();}
interface IInterface2 {void Play();}
•
string this [int index] {get;set}//定义接口索引器
•}
“:”表示继承,这和类的继承一样,但可以多继承
接口中的成员是一种没有实现体的抽象成员,他们 没有使用abstract关键字修饰,这是一个约定,因 为接口成员一定是抽象的。
整理ppt
2、接口的继承 • 接口允许多重继承,一个接口可以从多个基接口继承,并包含这些基
自身定义的成员。接口成员可以是方法、 属性、索引和事件,但不能有常数、运算 符、构造函数、析构函数、类型和静态成 员。 因为接口只具有“被继承”的特性,所以默 认时,所有接口成员只具有public特性,接 口成员的声明中不能含有任何其他修饰符。
整理ppt
example2
Interface IA
{
void compute(); //方法成员的声明
第五章 接口、委托、事件和异常
整理ppt
• 5.1、接口 • 5.2、委托 • 5.3、事件 • 5.4、异常处理
整理ppt
5.1 接口
• 接口是抽象成员的集合,这些抽象成员 可以是抽象方法、属性、索引器、事件等, 接口是实现多继承的工具。
• 实际上,接口是一些实现特定功能的抽 象成员的集合。
• 一个类可以继承多个接口,从而获得多 个行为的描述,将他们组合成新的功能并 在类中实现。
接口方法隐含的访问控制符是public的。
整理ppt
• 例:
• public interface IModelable: ICollection, IEnumerable
•{
•
void Pattern Name(string s);//定义接口方法
•
int Count {get;}
//定义接口属性
整理ppt
• 如果一个类实现了两个或两个以上名字、类型和参 数类型都相同的接口,那么类中的一个成员就可能 实现所有这些接口成员。
• 如:
interface IInterface1
{void Play();}
interface IInterface2
{void Play();}
class Mapping:IInterface1,IInterface2
整理ppt
e5_1.cs
• using System;
• public interface INextNum
•{
• int getNext(); 一个数字
//返回数字序列中的下
• void reset();
//重新开始
• void setStart(int x); //设置初始值
•}
整理ppt
• class MySeries : INextNum //实现接口INextNum
MailSet的完全限定名是:IMailBox.MailSet
整理ppt
5.1.3 接口的实现 接口的定义不包括方法的实现,接口可以由类
来实现,也可以由结构来实现。 所谓实现接口,就是继承他们并且在被继承方
法、属性、索引器和事件中填入体现所需行为的 代码。
用类来实现接口的格式: class 类名:[基类],接口,接口,……,接口
•}
• public void reset()//实现接口INextNum中的方法reset()
•{
•
start = 0;
•
number = 0;
•}
• public void setStart(int x)//实现接口INextNum中的方法setrestart()
•{
•
start = x;
•
number = x;
• }}
整理ppt
E5_2.cs
• class MySequence : INextNum
•{
• int start;
• int number;
• public MySequence()
•{
•
start = 0;
•
number = 0;
•}
• public int getNext()
•{
•
number += 3;
现继承;而接口继承只是说明继承。也就 是说,派生类可以继承基类的方法实现, 而派生类的接口只继承了父接口的成员方 法说明,而没有继承父接口的实现。 • 其次,C#中类继承只允许单继承,但是接 口继承允许多继承,一个子接口可以有多 个父接口。
整理ppt
5.1.2 接口的成员 1、接口的成员定义 接口成员包括从基接口继承的成员以及接口
这时,需将各个接口用逗号分开,并且基类名必须放在被 逗号分隔的接口列表名的首位。 • 在类中实现的接口成员(方法、属性、索引和事件)必须 定义为public。因为接口中声明的成员默认类型是public, 所以在类中实现的接口成员的类型也必须是public。 • 在类中实现的成员的数据类型也必须和它们在接口中声明 的类型完全一样。
• class LS
•{
• void Test(IListSeries ils)
•{
•பைடு நூலகம்
pute(1); //错误,产生二义性
•
pute(1.0);//正确,类型一致
•
((ISeries)ils).Compute (1);//正确,加了强制转换符
•
((IList)ils).Compute(1);//正确
整理ppt
• using System;
• interface ISeries
•{
• void Compute(double i);
•}
• interface Ilist
•{
• void Compute(int i);
•}
• interface IListSeries : ISeries, IList { }
来引用。 完全限定名:接口名加上小圆点“.”,后再跟上成员名。 成员的完全限定名将引用声明该成员的接口。 如: Interface IHandle {
void Write(); } Interface IMailBox:IHandle {
void MailSet(); } 则Write的完全限定名是:IHandle.Write
{ void SetText (string text); } Interface IListBox:IHandle
{ void SetItems (string[] item); } Interface IComboBox: ITextBox, IListbox{}
整理ppt
注意,接口和类的继承不同: • 首先,类继承不仅说明继承,而且也是实
•}
•}
整理ppt
• 接口的多重访问也会带来成员访问上的问题,如example4
interface IA
{ void H(int i);}
interface IB : IA
{ new void H(int i);}
interface IC : IA { void L();}
interface ID : IB, IC { }
•{
• int start;
• int number;
• public MySeries() //构造函数
•{
•
start = 0;
•
number = 0;
•}
• public int getNext()//实现接口INextNum中的方法getNext()
•{
•
number += 2;
•
return number;
下面给出接口映射的过程,假设类C实现了一个接口IA, Menber是接口IA中一个成员,Menber的映射过程时这样的。 ①如果C中存在一个显式接口成员执行体,该执行体与接口 IA及其成员Menber相对应,则由它来实现Menber成员。 ②如果条件①不满足,且C中存在一个非静态的公有成员, 该成员与接口成员Menber相对应,则由它来实现Menber成 员。 ③如果上述条件仍不满足,则在C说明的基类类表中寻找一 个基类D,用D来代替C。 ④重复步骤① ~ ③,遍历C的所有直接基类和非直接基类, 直到找到一个满足条件的类的成员。 ⑤如果仍然没有找到,则报告出错。
整理ppt
1、类实现接口 (1)、一个类实现一个接口e5_1.cs (2)、多个类实现一个接口e5_2.cs (3)、一个类实现多个接口e5_3.cs
接口可以实现多重继承,即可以在同一 个类中同时实现多个接口。格式上即将要 实现的多个接口用逗号分开。一个类实现 多个接口,要求它必须实现这些接口的所 有成员。
接口继承树上的所有基接口。 • 当接口从多个接口中继承时,用冒号“:”后跟被继承的接口名字,
多个接口名之间用“,”分割。 • 接口不允许直接或间接从自身继承。 example1 using System; Interface IHandle
{ void Compute(); } Interface ITextBox :IHandle
整理ppt
5.1.1 定义接口 1、接口的声明
【格式】: • [特性][ 接口修饰符] interface 接口名:[基接口列表] •{ • 接口体 •} • 【说明】: 接口修饰符:new、public、protected、internal、private。 把出现在基接口列表中的基接口称为显示基接口。 接口体的声明可以有:接口方法声明、接口属性声明、接
int next
//属性成员的声明
{ get;
set;
}
int this [int index]//索引器的声明
{
get;
}
event Press MyEvent; // 事件成员的声明
}
整理ppt
2、接口成员的访问 接口成员是通过I.M形式的成员访问表达式和I[A]
形式的索引器访问表达式来访问的,其中I是接口 类型,M是该接口类型的方法、属性或事件,A是 对应的索引器参数类表。 对接口方法的调用和采用索引器访问的规则和类 中的情况是相同的。 如果底层成员的命名与继承而来的高层成员一致, 那么底层成员将覆盖同名的高层成员。 但由于接口支持多继承,在多继承中,如果两个 父接口含有同名的成员,这就产生了二义性,这 时需要进行显示的声明。example3
•
return number;
•}
• public void reset()
•{
•
start = 0;
•
number = 0;
•}
• public void setStart(int x)
•{
•
start = x;
•
number = x;
•}
•}
整理ppt
2、接口映射
类必须为在基类中列出的所有接口的成员提供具体的实 现。在类中定位接口成员的实现称之为接口映射(interface mapping)。