版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、单元3 面向对象的c# 知识目标 v(1)理解面向对象的封装性、继承性和多态性;v(2)掌握类的定义;v(3)掌握静态方法和静态类;v(4)掌握c#的继承语法;v(5)掌握接口的声明和实现的语法;v(6)理解抽象方法和接口的作用。能力目标v(1)能理解面向对象的封装性、继承性、多态性;v(2)能将常见的事物抽象成恰当的类;v(3)能正确定义类和类的成员,能使用访问修饰符控制封装程度;v(4)能以对象及对象与对象的相互作用来分析问题;v(5)能以继承表示实际问题中分类;v(6)能理解并使用接口约定不同类型对象的行为;v(7)能理解接口和抽象类的差别。教学任务v任务1 类的定义及使用v任务2 构造
2、函数、静态成员和命名空间v任务3 类的继承v任务4 多态v任务5 接口单元3 面向对象的c# 任务1 类的定义及使用引例v使用类的方法,描述一个汽车类,并使用该类。知识储备v知识点1:类的定义,定义一个汽车类的基本形式。v知识点2:类成员的定义:字段、方法、属性和索引器,为汽车类设计字段、方法、属性和索引器。v知识点3:访问修饰符的使用(private和public)。v知识点4:类的使用对象,输出和修改汽车的相关信息。知识点1:类的定义v类是一个定义对象形式的模版。v它指定了数据以及操作数据的代码。vc#使用类的规范来构造对象,而对象是类的实例。v从定义上来说,类是一个数据结构,包含数据成员
3、(属性、字段)、功能成员(方法、事件、构造函数和析构函数等)和嵌套类型。语法格式:修饰符 class 类名 :基类 类成员;“ ”表示可选项class car /类成员汽车类知识点2:类成员的定义:字段、方法、属性和索引器v字段相当于简单变量,它可以声明为静态的,也可以声明为只读的。当字段被声明为只读时,与声明为const的效果是一样的,其区别在于,只读型表达式在程序运行时形成,而const型表达式的值在编译时就形成了。v语法格式:修饰符 字段类型 字段名示例v汽车类中的字段 class car public int wheels;/轮子的个数 public float weight;/重量
4、实践任务1v设计一个学生类,该类能够记录学生姓名、年龄、班级和学号信息,分别设置字段和属性。姓名(name)年龄(age)班级(class)学号(sno)student方法v方法是一个执行可以由对象或类完成的计算或行为的成员。v方法有一个形式参数列表(可能为空)、一个返回值(或void)并且可以是静态也可以是非静态。静态方法要通过类来访问。非静态方法也称为实例方法,通过类的实例来访问。方法定义语法格式:修饰符 返回类型 方法名(形式参数表) /方法体 示例:将原有的长方形扩大了factor倍 public void magnify(int factor) length = length * f
5、actor; width = width * factor; 示例:定义一个student类,并定义一个计算成绩总分的方法。class student public string sno; public string sname; public double sum(double ccj1, double ccj2) return ccj1 + ccj2; 调用方法在方法声明的类定义中调用该方法:方法名方法名( (参数列表参数列表) )在方法声明的类定义外部调用方法:对象名对象名. .方法名方法名( (参数列表参数列表) ) 【例3-1】求两个整数之和。 class program stati
6、c void main(string args) int a = 1, b = 1; console.writeline(add(a, b); console.readkey(); public static int add(int a,int b) return a + b; 参数传递v在方法声明中使用的参数叫形式参数(形参),在调用方法中使用的参数叫实际参数(实参)。在调用方法时,参数传递就是将实参传递给形参的过程。max类定义中声明方法时的形参如下:public int intmax(int a, int b) 则声明对象max后调用方法时的实参如下:max.intmax(x,y);按值
7、传递和按引用传递swap方法代码如下: public void swap(int a,int b) int c=a;a=b;b=c; 则调用该方法的语句代码如下: swap(a1, b1); swap方法改写如下: public void swap(ref int a,ref int b) int c=a;a=b;b=c; 则调用该方法的语句代码如下: swap(ref a1,ref b1); / 在实参中增加ref关键字实践任务2v显示学生的信息,为学生类设计一个显示信息的方法。属性v属性是提供对对象或类的特性进行访问的成员。属性是字段的正常延伸都是与类型相关的有名称的成员,并且访问字段和属
8、性的语法是相同的。v与字段不同的是:v属性不指示存储位置。作为字段的替代,为了对它们的数值进行读写,属性有访问符来指定要执行的语句。这样,属性为读写对象的属性的相关行为提供了某个机制,并且它们允许那些属性可以被计算。封装性为字段生成属性后,字段的访问修饰符就不是public了语法格式:修饰符 返回类型 属性名 get语句集合; set语句集合; public int wheels get return wheels; set wheels = value; 小窍门:在vs里选中要生成属性的字段,使用快捷键ctrl+r+e能快速生成属性。属性v属性是用相关类型成员命名的。有存取程序,它指定声明的
9、执行来对他们的进行读或写。v只读属性 只写属性修饰符 返回类型 属性名 get语句集合; 修饰符 返回类型 属性名 set语句集合; 【例3-2】定义一个长方形类,该类包含长、宽字段和属性。 public class rectangle private double length; public double length get return length; set if (value 0) length = value; private double width; public double width get return width; set width = value; 索引器v索引
10、器是属性的一种,同时本质上索引器和属性都是一种方法。v和属性的区别: 数据成员是数组或者其他集合,使用索引器完成数据访问权限的控制功能。索引器定义语法格式:修饰符 返回类型 this数据类型 标识符get语句集合;set语句集合;区别于属性【例3-3】索引器的使用。为cinema类添加一个索引器,用来存放当前播放的电影片名。class cinema private string names = new string5; public string thisint n get return namesn; set namesn = value; class program static void
11、 main(string args) films f = new films(); f0 = 画皮2; console.writeline(f0); console.readkey(); 索引器的定义调用索引器例3-4为汽车类设计方法和属性。 using system;class car private string type;/类型 private int wheels;/轮子的个数 private float weight;/重量 public string type get return type; set type = value; public int wheels get retu
12、rn wheels; set wheels = value; public float weight get return weight; set weight = value; public void speak() console.writeline(“我是0 ,1个轮子,重量为2吨”,type,wheels,weight); 知识点3:访问修饰符的使用(private和public)v不管是在定义数据成员还是在定义功能成员时,在前面都要加上一些修饰符:public、protected、internal和private(修饰符private可以省去)。这些修饰符在前面也提到过,他们的作用是
13、控制声明类型的可访问性。现在详细介绍一下它们控制声明类型的可访问性。vpublic、protected、internal和private叫做访问修饰符,用于指定声明的成员或类型的可访问性。访问修饰符vpublic,访问不受限制。vinternal,访问范围限于此程序。vprotected,访问范围现定于它所属的类或从该类派生的类型。vprivate,访问范围限定于它所属的类型。类成员访问修饰符的默认值为private。使用 public 关键字 public class sample public int x; public class mainclass public static void
14、 main() sample s = new sample(); s.x = 15; 使用 private 关键字 public class sample private int x; public class mainclass public static void main() sample s = new sample(); / private 拒绝访问 s.x = 15; / 不会编译 知识点4:类的使用对象v声明对象:类名 对象名;v实例化对象的语法格式为:v对象名 = new 类名( );v类与对象之间的关系:类就是对象的模板,而对象就是类的一个实例 car c; /声明对象 c
15、= new car(); /实例化对象 car c = new car ();【例3-5】实例化汽车对象,设置和显示汽车的相关信息。(引例的实现) class program static void main(string args) car c = new car(); c.type = 宝马; c.wheels = 4; c.weight = 1.45f; c.speak(); console.readkey(); 实践任务3v根据实践任务2完成的类,声明并实例化一个学生对象,设置和显示该学生的相关信息。归纳总结v知识要点:v(1)类定义的格式,关键字class;v(2)类成员的定义:字段
16、、方法和属性;v(3)访问修饰符的作用,实现程序的封装性;v(4)声明对象并实例化;v(5)通过“.”访问对象中的成员。拓展实践v设计一个时间类(time),该类能够显示时间,并对时、分、秒做加1和减1的操作。v提示:display(), addsecond(), addminute()单元3 面向对象的c# 任务2 构造函数、静态成员和命名空间引例v描述一个长方形类,并使用该类,在使用时希望能够方便的实现长和宽值传入。知识储备v知识点1:构造函数的定义和使用,为长方形类显示声明默认构造函数。v知识点2:重载,为长方形类添加一个参数构造函数和两个参数构造函数。v知识点3:静态成员和静态类,计算
17、生成的长方形对象的个数。v知识点4:命名空间的意义,定义命名空间的方法。知识点1:构造函数的定义和使用v构造函数是类的实例执行的时候的初始化操作。v构造函数的名称与类的名称相同。例如,如果一个类类名为myclass,那么它的构造函数的名称是myclass()v构造函数是在类的实例执行时初始化的方法。由于这个特性使得构造函数成为需要执行的所有初始化任务(如设置变量和属性的初始值)的理想位置。v每个类都有自己的构造函数。在访问这个类的时候系统最先执行的就是这个构造函数。v在没有定义构造函数的时候,系统会自动为我们生成一个默认构造函数使用构造函数时需要注意:v类的构造函数名要与类名相同。v构造函数没
18、有返回类型。v一般情况下构造函数是public类型的。v不能显式的调用构造函数。 class rectangle /显式声明默认构造函数 public rectangle() 调用: rectangle r = new rectangle();对比方法和构造函数的定义v修饰符 返回类型 方法名(参数列表)方法功能v构造函数的定义:v修饰符 方法名(参数列表)方法功能v构造函数是没有返回类型的,且构造函数的方法名和类名相同。析构函数v析构函数是在类破坏时自动执行的操作。它在碎片收集时自动调用。v在声明析构函数时,它的标识符必须为声明析构函数的类的命名,如果指定了任何其他名称,就会发生错误。v析构
19、函数的语法格式:v 类名()销毁实例的语法v例如,如果一个类类名为myclass,那么它的析构函数的名称是myclass()知识点2:重载v在一个类中定义多个方法名相同、方法间参数个数和参数类型不同的方法(对于参数个数不同或者参数列表不同的情况我们称之为参数列表不同)在同一个类中;方法名相同;参数列表不同。重载构造函数v除了系统提供的默认构造函数外,也可以根据类的需要,自定义构造函数。而且在实际情况中,构造函数往往需要使用形参。示例:创建一个长方形类对象时,需要给出长方形的长和宽。 class rectangle private double length; private double wi
20、dth; public rectangle() public rectangle(double length, double width) this.length = length; this.width = width; 在生成具体对象时,可以在实例化对象的同时,为对象的长和宽传值:rectangle r = new rectangle(6, 5)实践任务1:v定义一个快餐类,包含快餐中荤菜类型、素菜类型、是否带汤,以及价格,要求实现构造函数重载,用实现对象初始化。知识点3:静态成员和静态类v静态成员一般格式:使用static修饰符public class a public static i
21、nt count; public static void show() 【例3-6】创建控制台应用程序,创建rectangle(长方形)类,该类除包含非静态成员外,还包含一个静态数据成员用以统计长方形个数(对象个数),一个静态方法用以返回长方体个数。 class rectangle private double length; private double width; public rectangle(double l, double w) length = l; width = w; public static int count; public static void add() cou
22、nt+; class program static void main(string args) while (true) console.writeline(请输入长方形的长:); double l = double.parse(console.readline(); console.writeline(请输入长方形的宽:); double w = double.parse(console.readline(); rectangle r = new rectangle(l, w); rectangle.add(); console.writeline(生成长方形0个, rectangle.c
23、ount); console.writeline(是否继续生成长方形(y/n)?); if (console.readline() = n) break; 静态类v静态类与非静态类基本相同,但存在一个区别:静态类不能实例化。 也就是说,不能使用 new 关键字创建静态类类型的变量。v例如,如果名为staticclass 的静态类有一个名为 methoda 的公共方法,则按下面的示例所示调用该方法: vstaticclass.methoda();【例3-7】实现摄氏温度和华氏温度之间的转换。 public static class temperatureconverter public stat
24、ic double celsiustofahrenheit(string temp) double celsius = double.parse(temp); /摄氏度到华氏度的转换 double fahrenheit = (celsius * 9 / 5) + 32; return fahrenheit; public static double fahrenheittocelsius(string temperaturefahrenheit) double fahrenheit = double.parse(temperaturefahrenheit); /华氏度到摄氏度的转换 doubl
25、e celsius = (fahrenheit - 32) * 5 / 9; return celsius; class test static void main() console.writeline(请选择转换的方式); console.writeline(1. 摄氏度转换为华氏度.); console.writeline(2. 华氏度转换为摄氏度.); console.write(:); string selection = console.readline(); double f, c = 0; switch (selection) case 1: console.write(请输入
26、摄氏温度: ); f = temperatureconverter.celsiustofahrenheit(console.readline(); console.writeline(对应的华氏度为: 0, f); break; case 2: console.write(请输入华氏温度 ); c = temperatureconverter.fahrenheittocelsius(console.readline(); console.writeline(对应的摄氏度为: 0, c); break; default: console.writeline(请选择一种转换方式.); break;
27、 console.writeline(按任意键退出.); console.readkey(); 实践任务2v计算生成快餐对象的个数。知识点4:命名空间的意义,定义命名空间的方法。v.net3.5所提供的系统命名空间结构图使用命名空间组织代码v需要引用类的时候,就通过using关键字引入命名空间v定义方法示例如下: namespace model class class1 class class2 namespace model.class1 class class1 实践任务3v在不同的命名空间中定义同名快餐类,二者区别为构造函数不同,使用这两个类。引例分析与实现v创建控制台应用程序,创建re
28、ctangle(长方型)类,声明长方型构造函数及正方型构造函数的重载。创建对象时,根据给定的参数个数将对象初始化为长方体或正方体。 class rectangle double length; double width; /正方形构造函数 public rectangle(double length) this.length = length; /长方形构造函数 public rectangle(double length, double width) this.length = length; this.width = width; /长方形求面积方法 public double area(
29、double l, double w) return l * w; /正方形求面积方法 public double area(double l) return l * l; class program static void main(string args) console.writeline(请输入正方形边长:); double l = double.parse(console.readline(); rectangle r = new rectangle(l); console.writeline(正方形面积为:); console.writeline(r.area(l); consol
30、e.writeline(请输入长方形长:); l = double.parse(console.readline(); console.writeline(请输入长方形宽:); double w = double.parse(console.readline(); rectangle r1 = new rectangle(l, w); console.writeline(正方形面积为:); console.writeline(r.area(l, w); console.readkey(); 归纳总结v知识要点:v(1)构造函数的特点:一般为public,无返回类型,方法名与类名相同;v(2)构
31、造函数的使用,对象实例化时对成员传值;v(3)重载的概念;v(4)静态成员和静态类的关键字static;v(5)命名控件区分同名类,并层次化类。拓展实践v根据前面创建的学生类,创建两个构造函数,一个构造函数不传值,为其各属性赋默认值,另一个构造函数传4个值,分别为:姓名、年龄、班级和学号,并将传入的变量赋给对应的属性;利用循环生成10个学生对象,并求所有学生的平均年龄。单元3 面向对象的c# 任务3 类的继承引例v定义一个animal类,包含type属性,tostring()方法和sound()方法,并派生出dog类、cat类,派生类拥有另外一个属性name。知识储备v知识点1:类的继承。v知
32、识点2:继承隐私保护。v知识点3:继承时构造函数的调用。知识点1:类的继承vc#是一种面向对象的编程语言,它同样具有面向对象编程的一些特点。前面我们已经详细了解了类、对象、属性和构造函数等,它们是面向对象的基础知识,面向对象编程的更深层次的问题包括了继承性、多态性和异常等其他一些相关的知识。v继承性是从现有的类中派生出新类的功能,它能分析多态性的细微差别,并允许创建类层次结构,使用继承可以创建一个定义了多个相关项目共有特性的通用类。定义派生类v派生类能够继承基类的方法、特性等,但继承得到的成员也受作用域的限制,即使派生类继承得到基类成员,也可能无法访问。v派生类一般格式:类型修饰符 class
33、 类名 :基类名 派生类成员;示例 public class a public a() public void doa() public class b : a public b() public void dob() public class tester public void main() a a = new a(); b b = new b(); b.dob(); b.doa(); a.doa(); a.dob();/非法继承 b b1 = new b(); a a1 = (a)b1; /b对象可以调用强制转化为a类型,因为b继承自a 知识点2:继承隐私保护修饰符类内部子类其他类pub
34、lic可以可以可以protected可以可以不可以private可以不可以不可以说明: 如果父类中的成员只允许父类独有,不允许子类或其他类访问,则使用访问修饰符private,也就是说使用了private修饰符则只能在父类中使用。 如果父类中的成员,只允许父类和其派生类访问,不允许其他类访问,则在父类中用protected修饰该成员,当使用“base”关键字时,是可以访问父类成员的。实践任务1v描述一个长方体类(包含长宽高,带三个参数的构造函数,以及体积计算方法),并派生一个正方体类。知识点3:继承时构造函数的调用v构造函数调用:如果派生类的基类本身是另一个类的派生类,则构造函数的调用次序按由
35、高到低顺序依次运行。 public class a public a() console.writeline(a的构造函数); public class b : a public b() console.writeline(b的构造函数); public class c : b public c() console.writeline(c的构造函数); class program static void main(string args) c c = new c(); console.readkey(); 【例3-9】由长方形类派生出正方形类,正方形类的构造函数调用基类的构造函数。 class
36、 rectangle protected double length; private double width; public rectangle(double l, double w) length = l; width = w; class square : rectangle public square(double l) : base(l, 0) public double area() return length * length; class program static void main(string args) console.writeline(请输入正方形的长:); s
37、quare s = new square(double.parse(console.readline(); console.writeline(正方形的面积为:0, s.area(); console.readkey(); 继承的特性v1、传递性v子类的子类具备其父类以及父类父类的属性和方法。v2、单根性vc#的继承有一个很重要的特性,继承是单继承,不支持多继承,即,一个子类只能有一个父类。v3、密封性v在.net类库中,绝大多数类可以以基类产生派生类。因为从面向对象编程的思想看,类具有开发性,即一个类为了具有很好的扩展性,是不能密封的,因为类一旦密封,则该类不再具有扩展的空间。密封类v密封类
38、定义一般格式:访问修饰符 sealed class 类名称密封方法v一般格式:public class a public sealed void show() sealed类与方法v被声明为sealed的类不能被继承v被声明为sealed的方法不能被重写调用基类的同名方法v已替换或重写了某个方法的派生类仍可以使用 base 关键字访问基类中的该方法。在派生类中声明与基类同名的方法,也叫方法的重写。在派生类重写基类方法后,如果想调用基类的同名方法,使用base关键字 public class a public void dowork() public class b : a public new
39、 void dowork() base.dowork();/ a类的dowork()方法 归纳总结v知识要点:v(1)派生类的定义方法;v(2)protected访问修饰符作用;v(3)继承的顺序,继承的特点子类只能继承自一个父类;v(4)构造函数和方法的继承;引例分析与实现v定义一个animal类,包含type属性,tostring()方法和sound()方法,并派生出dog类、cat类,派生类拥有另外一个属性name。并在测试类中测试定义的类。 class animal private string type; public string type get return type; set
40、 type = value; public string tostring() return 这是一个动物类; public void sound() console.writeline(动物声音); class cat : animal private string name; public string name get return name; set name = value; private string breed; public string breed get return breed; set breed = value; public string tostring() r
41、eturn cats name is + name + ,属于 + breed + ,在被抚摸感到舒服的时候,会; public void sound() console.writeline(喵喵叫); class animaltest static void main(string args) animal d1 = new dog(); animal c1 = new cat(); dog d = new dog(); d.name = 吉娃娃; d.breed = 哺乳类和肉食性; console.write(d.tostring(); d.sound(); cat c = new ca
42、t(); c.name = 波斯猫; c.breed = 哺乳类和肉食性; console.write(c.tostring(); c.sound(); console.readkey(); 拓展实践v定义一个交通工具(vehicle)类,拥有轮子和重量两个公共属性,并派生出小汽车(car)类添加载客人数属性,并定义显示车辆信息的方法。单元3 面向对象的c# 任务4 多态引例v描述一个几何图形类,并派生出长方形类、正方形类、圆形类。知识储备v知识点1:虚方法和方法隐藏v知识点2:抽象类和抽象方法。知识点1:虚方法和方法隐藏v方法隐藏v当子类中有与父类同名方法时,会出现隐藏继承的成员时,该成员的
43、派生版本将替换基类版本。v如果基类定义了方法、字段或属性,则 new 关键字将用于在派生类中创建该方法、字段或属性的新定义。 public class basec public static int x = 55; public static int y = 22; public void dowork() console.writeline(基类的方法); public class derivedc : basec new public static int x = 100; public new void dowork() console.writeline(派生类的方法); static
44、 void main() / 显示新的x的值 console.writeline(x); / 显示隐藏的x的值 console.writeline(basec.x); / 显示未隐藏的y的值 console.writeline(y); console.readkey(); (); 隐藏和重载的区别v隐藏是发生在父类与子类之间,在子类中重新定义父类中的方法,子类中的方法和父类的方法是一样的,包括方法名和参数列表完全相同。v重载是同一个作用域内发生(比如一个类里面),定义一系列同名方法,但是方法的参数列表不同。这样才能通过传递不同的参数来决定到底调用哪一个。而返回值类型不同是不能构成重载的。 de
45、rivedc b = new derivedc(); b.dowork(); /调用派生类方法 basec a = (basec)b; a.dowork(); / 调用基类方法虚方法v重写方法的一般格式: public class baseclass public virtual void show() public class derivedclass : baseclass public override void show() 注意:字段不能是虚拟的;只有方法、属性、事件和索引器可以是虚拟的。overridev为了使派生类的实例完全接替来自基类的类成员,基类必须将该成员声明为虚拟的。这是
46、通过在该成员的返回类型之前添加 virtual 关键字来实现的。然后,派生类可以选择使用 override 关键字,将基类实现替换为它自己的实现。例如: public class basec public int workfield; public virtual void dowork() public class derivedc : basec public int workfield; public override void dowork() derivedc b = new derivedc();b.dowork(); /调用派生类的方法basec a = (basec)b;a.d
47、owork(); / 同样调用派生类的方法虚拟的传递v虚拟成员保持为虚拟的。如果类 a 声明了一个虚拟成员,类 b 派生自 a,而类 c 派生自 b,则类 c 将继承该虚拟成员并可以选择重写它,而不管类 b 是否为该成员声明了 override(重写)。 public class a public virtual void dowork() public class b : a public override void dowork() public class c : b public override void dowork() () 【例3-10】 rectangle类包含 x、 y 两
48、个坐标和 area() 虚方法。 circle继承 rectangle类,为每个图形计算表面积。 public class rectangle public const double pi = math.pi; protected double x, y; public rectangle() public rectangle(double x, double y) this.x = x; this.y = y; public virtual double area() return x * y; public class circle : rectangle public circle(do
49、uble r) : base(r, 0) public override double area() return pi * x * x; public static double fromarea(rectangle re) return re.area(); static void main() double r = 3.0, h = 5.0; rectangle rec = new rectangle(r, h); rectangle c = new circle(r); console.writeline(area of rectangle = 0, fromarea(rec); co
50、nsole.writeline(area of circle = 0, fromarea(c); console.readkey(); 多态的概念v多态性是面向对象程序设计中的又一个重要的概念,多态性是指通过基类引用,依靠执行多个派生类的方法,使程序执行动态操作。简单地说,多态是以同样的方法处理不同对象的能力。c#中每种类型都是多态的。知识点2:抽象类和抽象方法v如果一个基类,本身不提供已经实现的方法,只定义了所有派生类共享的一般形式,至于实现方法的内容交给派生类去填充。在这种情况下就需要一些方法来确保派生类继承并实现基类中方法的必要条件,这里我们可以使用抽象类。v抽象类不能实例化。抽象类的作
51、用是提供可供多个派生类共享的基类的公用定义。抽象类还可以定义抽象方法。这是通过在方法的返回类型前添加关键字 abstract 实现的。抽象类v定义抽象类的一般形式如下所示:vpublic abstract class a 抽象方法v定义抽象方法的一般形式如下所示:vv请注意,抽象方法是没有方法体的,这和空方法体是两个不同的概念。 public abstract class character public abstract void dowork(int i); 抽象类和抽象方法使用注意:v抽象类不能实例化v要想使用抽象类,必须继承这个类,生成派生类v抽象方法没有语句块v要想使用抽象方法,必须
52、对它进行重写v抽象方法所在的类必然是抽象类v抽象类中可以有抽象方法,也可以没有实践任务1v设计一个绘画类(drawingbase)为抽象类,并派生出line类和circle类,重载draw(),显示不同的信息。 引例分析与实现v描述一个几何图形类,并派生出长方形类、正方形类、圆形类。v这里我们使用抽象来完成这个引例。请读者体会,虚方法和抽象在实现多态时的区别 public abstract class dimensions public const double pi = math.pi; protected double x, y; public dimensions() public di
53、mensions(double x, double y) this.x = x; this.y = y; public abstract double area(); public class rectangle : dimensions public rectangle(double l, double w) : base(l, w) public override double area() return x * y; public class circle : dimensions public circle(double r) : base(r, 0) public override
54、double area() return pi * x * x; public class square : dimensions public square(double l) : base(l, 0) public override double area() return x * x; static void main() double r = 3.0, h = 5.0; dimensions rec = new rectangle(r, h); dimensions c = new circle(r); dimensions s = new square(r); console.wri
55、teline(area of rectangle = 0, c.area(); console.writeline(area of circle = 0, rec.area(); console.writeline(area of square = 0, s.area(); console.readkey(); 归纳总结v知识要点:v(1)方法隐藏,关键字new;v(2)虚方法实现多态;v(3)抽象类和抽象方法。拓展实践v定义抽象类pet(宠物)类为基类,类中定义两个私有字段毛色和年龄,定义虚方法完成宠物的自我介绍功能;定义两个派生类cat和dog,重写基类方法;定义包含主方法的类maincl
56、ass,调用派生类的重写方法。单元3 面向对象的c# 任务5 接口引例v设计一个遥控器,分别实现电视机遥控和dvd的遥控。知识储备v知识点1:接口的定义。v知识点2:接口的使用。知识点1:接口的定义v接口用来定义一种程序的协定。它包含属性、方法、事件和索引器。接口本身不提供它所定义的成员的实现。接口只指定实现该接口的类或接口必须提供的成员,所以接口不能被实例化。v接口是使用 interface 关键字定义的修饰符 interface 接口名称:继承的接口列表 /接口内容 interface icomparable int compareto(object obj); 接口与抽象类抽象类抽象类可
57、以具有实现代码用于为相关派生类提供公用方法签名,以及公用方法和实例变量可以包含实例变量接口接口是完全抽象的用于表示一组抽象行为,这些行为可以由不相关的类实现不能包含实例常量接口可以包含事件、索引器、方法和属性,但接口中不能包含字段。同样,接口不能包含方法的实现。接口的成员自动成为公共的,且不能显示地说明访问权限,接口的名称习惯以字母“i”开头。示例:任意一个点拥有整数属性x和y interface ipoint int x get; set; int y get; set; 接口的特点:vc#的接口是独立于类来定义的v接口可以定义属性、方法、事件和索引器v一个接口定义一个只有抽象成员的引用类型
58、,没有执行代码v接口不能继承类v类可以继承接口v接口和类都可以继承多个接口v类只能继承一个类知识点2:接口的实现v实现接口语法如下:v一个类可以从多个接口继承,当类继承接口时,它只继承方法名称和签名,因为接口本身不包含任何实现;接口本身也可以从多个接口继承,但继承接口的任何非抽象类型必须实现接口的所有成员。class 类名:接口名class 子类名:父类名,接口名【例3-11】实现对前面ipoint接口的实现。在测试类中完成对继承自接口ipoint的point的使用。 interface ipoint int x get; set; int y get; set; class point : ipoint private int x; private int y; public point(int x, int y) this.x = x; this.y = y; public int x get return x; set x = value; public int y get return y; set y = value; class mainclass static void printpoint(ipoint p) console.writeline(x=0, y=1, p.x, p.y); static void main() point p = new
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 家庭果树出售合同范本
- 开工庆典礼仪合同范本
- 广州直租商铺合同范本
- 崇明恒温配送合同范本
- 底商托管服务合同范本
- 平面广告工程合同范本
- 大米委托加工合同范本
- 审计收费标准合同范本
- 八年级生物上册第三单元第四章第二节蒸腾作用教案冀少版(2025-2026学年)
- 部编三年级语文上册灰雀教案套(2025-2026学年)
- 2025-2026学年岭南版小学美术六年级(上册)期末测试卷附答案
- 2025河南周口临港开发区事业单位招才引智4人考试重点题库及答案解析
- 2025年药学统计学试题及答案
- 新疆维吾尔自治区阿克苏地区阿克苏市2024-2025学年九年级上学期1月期末英语试题
- 电煤销售合同范本
- 商场招商人员述职报告
- 180th燃煤锅炉整体设计
- 工程伦理-形考任务四(权重20%)-国开(SX)-参考资料
- 工伤的事故调查报告
- 酒店年终总结汇报
- 《无人机地面站与任务规划》 课件 第1-5章 概论 -无人机航测任务规划与实施
评论
0/150
提交评论