C# 继承和接口 PPT
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用接口成员也可采用其“完全有效名称” (fully
qualified name)。它是这样构成的,接口名加句点
“.”,再跟成员名。
7.3.3 接口的实现
接口的声明仅仅给出了抽象方法,相当于程序 开发早期的一组协议。具体地实现接口所规定的 功能,则需某个类为接口中的抽象方法定义实在 的方法体(即语句),称为实现这个接口。
7.1.1 继承的基本知识 继承(Inheritance)是自动地共享类、派生类和对
象中的方法和数据的机制。它允许在既有类的基础 上创建新类,新类从既有类中继承类成员,而且可 以重新定义或加进新的成员,从而形成类的层次或 等级。一般称被继承的类为基类或父类,而继承后 产生的类为派生类或子类。
类之间的继承关系的存在,对于在实际系统的开 发中迅速建立原型,提高系统的可重用性和可扩充性, 具有十分重要的意义。
中具有不同的语义。
7.2.2 虚方法
当方法声明中包含virtual修饰符时,方法 就被称为虚方法。当没有virtual修饰符时,方法 被称为非虚方法,虚方法定义中不能包含static、 abstract或override修饰符。
非虚方法的执行是不变的,不管方法在从 它声明的类的实例中还是在派生类中的实例中被 调用,执行都是相同的。相反,虚方法的执行可 以被派生类改变,具体实现是在派生类中重新定 义此虚方法实现的。重新定义此虚方法时,要求 方法名称、返回值类型、参数表中的参数个数、 类型顺序都必须与基类中的虚方法完全一致,而 且要在方法声明中加上override关键字,不能有 new , static或virtual修饰符。
} 类 RingSequence除了要实现接口IRing中的方法Insert外,还必须同 时实现接口IRing基接口 ISequence中的方法Add。
一个类还可以实现多个接口,例如:
using System; interface IControl { void Paint ( );} interface IDataBound { void Bind (int b);} public class Control: IControl { public void Paint ( ) {...}} public class EditBox: Control, IControl, IDataBound { public void Paint ( ) {...}
public void Bind (int b) {...} } 上 例 中 , 类 EditBox 从 Control 类 继 承 , 并 同 时 实 现 了 Icontrol 和 IdataBound 接 口 。 EditBox 中 的 Paint 方 法 来 自 Icontrol,Bind方法来自IdataBound接口。
11.
get;
12.
set;
13.
get;set;
14.
set;get;
15. 即接口的属性可以是只读、只写或可读可写的。
3. 接口事件 接口事件用接口事件声明来声明:
[接口事件修饰符] [new] event 类型名 接口事件标识符;
接口事件声明了一个事件。实现接口事件的类可以通 过事件与其他类进行交流。
上面的代码中Icontrol. Paint和I.parable.CompareTo就是显式 接口成员执行体。
例:using System interface ICloneable { object Clone ( );} interface I.parable { int .pareTo (object other);} class ListEntry: ICloneable, IComparable { object ICloneable.Clone ( ) {...} int I.parable.CompareTo (object other) {...} }
{
DEmp dz=new DEmp();
Console.Wriine("该员工的实际工资为:{0}",dz.Esalary());
}
}
当一个实例方法声明包含一个override限 定符
时,这个方法就用相同的属性覆盖一个被继 承的
虚拟方法,则此方法被称为覆盖方法。覆盖 方法
声明不能包括new,static,virtual或abstract 限定
型的接口继承,接口还不允许直接或间接地从自
身继承。
例:
using System; interface IControl {
void Paint ( ); } interface ITextBox : IControl {
void SetText (string text); } interface IListBox : IControl {
7.3.2 接口的成员
1.接口成员的定义 接口可以包含一个或多个成员,这些成员可以
是方法、属性等,但不能是常量、运算符、构造函 数或析构函数,而且不能包含任何静态成员。
例: public interface ImyList {
void Add (string s); int Count { get;} }
第7章 继承和接口
内容提要: C#的继承机制 派生类的构造与析构 多态性 继承和接口的用法
目的要求: 掌握继承和接口的声明及调用
重点难点: 继承、接口
7.1 C#的继承机制
继承使面向对象技术能够提高软件开发效率 的重要原因之一,其定义是:特殊类的对象拥有 其一般类的全部属性与服务,称作特殊类对一般 类的继承。
5. 对接口成员的访问
接口方法的调用和采用索引指示器访问的 规
则与类的情况也是相同的,如果底层成员的命 名
与继承而来的高层成员一致,那么底层成员将 覆
盖同名的高层成员。但是接口是支持多继承的,
这样在多继承中如果两个父接口含有同名的成 员
就会产生二义性。这时就需要进行显式的声明。
6. 接口成员的完全有效名称
return psalary;
}
}
class DEmp:Employee
{ new public double Esalary()
{ Console.Wriine(" 计算大专生员工的工资");
return 1.5*base.Esalary();
}
}
class Test
{
static void Main()
7.2 多态性
面向对象的程序设计语言中,多态性 是第三种最基本的特征(前两种是封装和 继承)。多态性(polymorphism来自希腊 语,意思是多种形态)是指允许一个接口
访问动作的通用类的性质。
7.2.1 多态性概述 多态性是指在一般类中定义的属性或 行为,被特殊类继承之后,可以具有不同 数据类型或表现出不同的行为。这使得同 一个属性或行为在一般类及其各个特殊类
}
}
1.
7.1.2 base关键字
base关键字用于从派生类中访问基类的成 员,它有两种基本用法:
· 指定创建派生类实例时应调用的基类构造 函数,用于调用基类的构造函数完成对基类 成员的初始化工作;
· 在派生类中访问基类成员。
例:using System;
class Employee
{ private double bsalary=1000;
1. 在类中实现接口
接口可以通过类或结构来实现,其实现方法 都是类似的。用类来实现接口时,接口的名称必 须包含在类声明中的基类列表中。
例如:
class Myclass: IMyInterface1, IMyInterface2
{
实现某个接口的类必须要同时实现该接口的基接口的所有成员。 例如:using System;
7.3 接口
接口是用来描述组件对外提供的服 务,并在组
件和组件之间,组件和客户之间定义 交互的标准。
组件一旦发布,它只能通过预先定义 的接口来提供
合理的,一致的服务,这种接口定义 之间的稳定性
7.3.1 接口的定义 1.声明 一个接口定义了一个协议。一个实现了某个接 口的类或结构必须符合它的协议。一个接口可以从 多个基本接口继承,而一个类或结构也可以实现多 个接口。 接口可以包含方法、属性和索引等(即在接口 中只能包含方法而不能包含变量)。接口自己不为 它所定义的成员提供具体实现。接口只是指定类中 必须被实现的成员。
2. 显式接口成员执行体 在某些情况下,类可能会使用完全有效名称来声明接口成员
的实现,以这种方式实现的接口成员称为显式接口成员。
例:public class EditBox: Icontrol, I.parable { void Icontrol.Paint( ) {…} void I.parable.CompareTo (int b) {...} }
double psalary;
1.
public int n;
public double Esalary()
{ Console.Write("该员工进公司的年数为:");
n=int.Parse(Console.ReadLine());
psalary=bsalary*(Math.Pow((1+0.15),(n-1)));
interface ISequence { object Add ( );} interface IRing: ISequence { int Insert (object obj);} class RingSequence: IRing
{ public object Add ( ) {...} public int Insert (object obj) {...}
{ public int 销售额;
运行结果如下:
}
class Test
{
static void Main()
{
Sales s1=new Sales();
s1.EmpID="001"; s1.EmpName="张三"; s1.销售额=100; Console.Wriine("员工一:"); Console.Wriine("代号={0},名称={1},销售额={2}",s1.ID,s1.Name,s1.销售额);
所有接口成员默认都是公有访问(即隐式地具有 public访问权限)。
2. 接口属性
3. 接口属性用接口属性声明来声明:
4. [接口属性修饰符] 接口属性类型 接口属性标识
5. {
6.
接口属性访问器;
7. }
8. 接口属性声明的访问器与类属性声明的访问器的
9. 用法相同。
10. 其中,访问器可以为:
符中的任何一个,对于一个覆盖声明,除非 下面
都是可行的,否则,编译时就会出错:
• 一个被覆盖的基本方法能被定位; • • 被覆盖的基本方法是虚拟的、抽象的方法, 既被 • 覆盖的基本方法不能是静态的或非虚拟的;
• 覆盖声明及被覆盖的基本方法具有相同的声 明访 • 问性。
• 一个覆盖声明访问被覆盖的基本方法。
4. 接口索引
5. 接口索引使用接口索引声明来声明:
6. [接口索引修饰符] [new] 类型名 this [参数列表] {接口访问器};
7. 接口索引声明中的属性、类型和形式参数列表与类的索引声 明的那些有相同的意义。
8. 接口索引声明的访问器与类索引声明的访问器相对应,可为: 9. get; 10. set; 11. get;set; 12. set;get; 13.即接口的索引可以是只读、只写或可读可写的。
格式: [接口修饰符] interface 接口名 [:基接口名]
2. 接口的继承
3.
接口具有不变性,但这并不意味着接口不再
发展。类似于类的继承性,接口也可以继承和发
源自文库
展。
4.
接口可以从零或多个接口中继承。从多个接
口中继承时,用“:”后跟被继承的接口名字。
多个接口名之间用“,”分割。被继承的接口应
该是可以访问到的,即不能从private或internal类
派生类的声明格式为:
属性 类修饰符 class 类名 :基类 {类体}
在类声明中,通过在类名的后面加上冒号和基类 名表示继承。
例:
using System;
class Employee
1{ .public string EmpID;
public string EmpName;
}
class Sales:Employee
void SetItems (string [ ] items); } interface I.boBox : ITextBox, IListBox { }
对一个接口的继承也就继承了接口的所有成员。上例中,接口ITextBox和 IListBox都从接口IControl中继承的,也就继承了接口IControl的Paint方法。 I.boBox的基本接口是IControl、ITextBox,和IListBox。即上面的接口IComboBox 继承了接口IControl的Paint方法、ITextBox的SetText方法和IListBox的SetItems方 法。
qualified name)。它是这样构成的,接口名加句点
“.”,再跟成员名。
7.3.3 接口的实现
接口的声明仅仅给出了抽象方法,相当于程序 开发早期的一组协议。具体地实现接口所规定的 功能,则需某个类为接口中的抽象方法定义实在 的方法体(即语句),称为实现这个接口。
7.1.1 继承的基本知识 继承(Inheritance)是自动地共享类、派生类和对
象中的方法和数据的机制。它允许在既有类的基础 上创建新类,新类从既有类中继承类成员,而且可 以重新定义或加进新的成员,从而形成类的层次或 等级。一般称被继承的类为基类或父类,而继承后 产生的类为派生类或子类。
类之间的继承关系的存在,对于在实际系统的开 发中迅速建立原型,提高系统的可重用性和可扩充性, 具有十分重要的意义。
中具有不同的语义。
7.2.2 虚方法
当方法声明中包含virtual修饰符时,方法 就被称为虚方法。当没有virtual修饰符时,方法 被称为非虚方法,虚方法定义中不能包含static、 abstract或override修饰符。
非虚方法的执行是不变的,不管方法在从 它声明的类的实例中还是在派生类中的实例中被 调用,执行都是相同的。相反,虚方法的执行可 以被派生类改变,具体实现是在派生类中重新定 义此虚方法实现的。重新定义此虚方法时,要求 方法名称、返回值类型、参数表中的参数个数、 类型顺序都必须与基类中的虚方法完全一致,而 且要在方法声明中加上override关键字,不能有 new , static或virtual修饰符。
} 类 RingSequence除了要实现接口IRing中的方法Insert外,还必须同 时实现接口IRing基接口 ISequence中的方法Add。
一个类还可以实现多个接口,例如:
using System; interface IControl { void Paint ( );} interface IDataBound { void Bind (int b);} public class Control: IControl { public void Paint ( ) {...}} public class EditBox: Control, IControl, IDataBound { public void Paint ( ) {...}
public void Bind (int b) {...} } 上 例 中 , 类 EditBox 从 Control 类 继 承 , 并 同 时 实 现 了 Icontrol 和 IdataBound 接 口 。 EditBox 中 的 Paint 方 法 来 自 Icontrol,Bind方法来自IdataBound接口。
11.
get;
12.
set;
13.
get;set;
14.
set;get;
15. 即接口的属性可以是只读、只写或可读可写的。
3. 接口事件 接口事件用接口事件声明来声明:
[接口事件修饰符] [new] event 类型名 接口事件标识符;
接口事件声明了一个事件。实现接口事件的类可以通 过事件与其他类进行交流。
上面的代码中Icontrol. Paint和I.parable.CompareTo就是显式 接口成员执行体。
例:using System interface ICloneable { object Clone ( );} interface I.parable { int .pareTo (object other);} class ListEntry: ICloneable, IComparable { object ICloneable.Clone ( ) {...} int I.parable.CompareTo (object other) {...} }
{
DEmp dz=new DEmp();
Console.Wriine("该员工的实际工资为:{0}",dz.Esalary());
}
}
当一个实例方法声明包含一个override限 定符
时,这个方法就用相同的属性覆盖一个被继 承的
虚拟方法,则此方法被称为覆盖方法。覆盖 方法
声明不能包括new,static,virtual或abstract 限定
型的接口继承,接口还不允许直接或间接地从自
身继承。
例:
using System; interface IControl {
void Paint ( ); } interface ITextBox : IControl {
void SetText (string text); } interface IListBox : IControl {
7.3.2 接口的成员
1.接口成员的定义 接口可以包含一个或多个成员,这些成员可以
是方法、属性等,但不能是常量、运算符、构造函 数或析构函数,而且不能包含任何静态成员。
例: public interface ImyList {
void Add (string s); int Count { get;} }
第7章 继承和接口
内容提要: C#的继承机制 派生类的构造与析构 多态性 继承和接口的用法
目的要求: 掌握继承和接口的声明及调用
重点难点: 继承、接口
7.1 C#的继承机制
继承使面向对象技术能够提高软件开发效率 的重要原因之一,其定义是:特殊类的对象拥有 其一般类的全部属性与服务,称作特殊类对一般 类的继承。
5. 对接口成员的访问
接口方法的调用和采用索引指示器访问的 规
则与类的情况也是相同的,如果底层成员的命 名
与继承而来的高层成员一致,那么底层成员将 覆
盖同名的高层成员。但是接口是支持多继承的,
这样在多继承中如果两个父接口含有同名的成 员
就会产生二义性。这时就需要进行显式的声明。
6. 接口成员的完全有效名称
return psalary;
}
}
class DEmp:Employee
{ new public double Esalary()
{ Console.Wriine(" 计算大专生员工的工资");
return 1.5*base.Esalary();
}
}
class Test
{
static void Main()
7.2 多态性
面向对象的程序设计语言中,多态性 是第三种最基本的特征(前两种是封装和 继承)。多态性(polymorphism来自希腊 语,意思是多种形态)是指允许一个接口
访问动作的通用类的性质。
7.2.1 多态性概述 多态性是指在一般类中定义的属性或 行为,被特殊类继承之后,可以具有不同 数据类型或表现出不同的行为。这使得同 一个属性或行为在一般类及其各个特殊类
}
}
1.
7.1.2 base关键字
base关键字用于从派生类中访问基类的成 员,它有两种基本用法:
· 指定创建派生类实例时应调用的基类构造 函数,用于调用基类的构造函数完成对基类 成员的初始化工作;
· 在派生类中访问基类成员。
例:using System;
class Employee
{ private double bsalary=1000;
1. 在类中实现接口
接口可以通过类或结构来实现,其实现方法 都是类似的。用类来实现接口时,接口的名称必 须包含在类声明中的基类列表中。
例如:
class Myclass: IMyInterface1, IMyInterface2
{
实现某个接口的类必须要同时实现该接口的基接口的所有成员。 例如:using System;
7.3 接口
接口是用来描述组件对外提供的服 务,并在组
件和组件之间,组件和客户之间定义 交互的标准。
组件一旦发布,它只能通过预先定义 的接口来提供
合理的,一致的服务,这种接口定义 之间的稳定性
7.3.1 接口的定义 1.声明 一个接口定义了一个协议。一个实现了某个接 口的类或结构必须符合它的协议。一个接口可以从 多个基本接口继承,而一个类或结构也可以实现多 个接口。 接口可以包含方法、属性和索引等(即在接口 中只能包含方法而不能包含变量)。接口自己不为 它所定义的成员提供具体实现。接口只是指定类中 必须被实现的成员。
2. 显式接口成员执行体 在某些情况下,类可能会使用完全有效名称来声明接口成员
的实现,以这种方式实现的接口成员称为显式接口成员。
例:public class EditBox: Icontrol, I.parable { void Icontrol.Paint( ) {…} void I.parable.CompareTo (int b) {...} }
double psalary;
1.
public int n;
public double Esalary()
{ Console.Write("该员工进公司的年数为:");
n=int.Parse(Console.ReadLine());
psalary=bsalary*(Math.Pow((1+0.15),(n-1)));
interface ISequence { object Add ( );} interface IRing: ISequence { int Insert (object obj);} class RingSequence: IRing
{ public object Add ( ) {...} public int Insert (object obj) {...}
{ public int 销售额;
运行结果如下:
}
class Test
{
static void Main()
{
Sales s1=new Sales();
s1.EmpID="001"; s1.EmpName="张三"; s1.销售额=100; Console.Wriine("员工一:"); Console.Wriine("代号={0},名称={1},销售额={2}",s1.ID,s1.Name,s1.销售额);
所有接口成员默认都是公有访问(即隐式地具有 public访问权限)。
2. 接口属性
3. 接口属性用接口属性声明来声明:
4. [接口属性修饰符] 接口属性类型 接口属性标识
5. {
6.
接口属性访问器;
7. }
8. 接口属性声明的访问器与类属性声明的访问器的
9. 用法相同。
10. 其中,访问器可以为:
符中的任何一个,对于一个覆盖声明,除非 下面
都是可行的,否则,编译时就会出错:
• 一个被覆盖的基本方法能被定位; • • 被覆盖的基本方法是虚拟的、抽象的方法, 既被 • 覆盖的基本方法不能是静态的或非虚拟的;
• 覆盖声明及被覆盖的基本方法具有相同的声 明访 • 问性。
• 一个覆盖声明访问被覆盖的基本方法。
4. 接口索引
5. 接口索引使用接口索引声明来声明:
6. [接口索引修饰符] [new] 类型名 this [参数列表] {接口访问器};
7. 接口索引声明中的属性、类型和形式参数列表与类的索引声 明的那些有相同的意义。
8. 接口索引声明的访问器与类索引声明的访问器相对应,可为: 9. get; 10. set; 11. get;set; 12. set;get; 13.即接口的索引可以是只读、只写或可读可写的。
格式: [接口修饰符] interface 接口名 [:基接口名]
2. 接口的继承
3.
接口具有不变性,但这并不意味着接口不再
发展。类似于类的继承性,接口也可以继承和发
源自文库
展。
4.
接口可以从零或多个接口中继承。从多个接
口中继承时,用“:”后跟被继承的接口名字。
多个接口名之间用“,”分割。被继承的接口应
该是可以访问到的,即不能从private或internal类
派生类的声明格式为:
属性 类修饰符 class 类名 :基类 {类体}
在类声明中,通过在类名的后面加上冒号和基类 名表示继承。
例:
using System;
class Employee
1{ .public string EmpID;
public string EmpName;
}
class Sales:Employee
void SetItems (string [ ] items); } interface I.boBox : ITextBox, IListBox { }
对一个接口的继承也就继承了接口的所有成员。上例中,接口ITextBox和 IListBox都从接口IControl中继承的,也就继承了接口IControl的Paint方法。 I.boBox的基本接口是IControl、ITextBox,和IListBox。即上面的接口IComboBox 继承了接口IControl的Paint方法、ITextBox的SetText方法和IListBox的SetItems方 法。