单元3-面向对象的C#-C#程序设计课件.ppt
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 构造函数、静态成员和命名空间v任务3 类的继承v任务4 多态v任务5 接口引例v使用类的方法,描述一个汽车类,并使用该类。知识储备v知识点1:类的定义,定义一个汽车类的基本形式。v知识点2:类成员的定义:字段、方法、属性和索引器,为汽车类设计字段、方法、属性和索引器。v知识点3:访问修饰符的使用(private和public)。v知识点4:类的使用对象,输出和修改汽车的相关信息。知识点1:类的定义v类是一个定义对象形式的模版。v它指定了数据以及操作数据的代码。vC#使用类的规范来构造对象,而对象是类的实例。v从定义上来说,类是一个数据结构,包含数据成员(属性、字段)、功能成员(方法、事件、构造函数和析构函数等)和嵌套类型。知识点2:类成员的定义:字段、方法、属性和索引器v字段相当于简单变量,它可以声明为静态的,也可以声明为只读的。当字段被声明为只读时,与声明为const的效果是一样的,其区别在于,只读型表达式在程序运行时形成,而const型表达式的值在编译时就形成了。v语法格式:修饰符字段类型字段名示例v汽车类中的字段 class Car public int wheels;/轮子的个数 public float weight;/重量 方法v方法是一个执行可以由对象或类完成的计算或行为的成员。v方法有一个形式参数列表(可能为空)、一个返回值(或void)并且可以是静态也可以是非静态。静态方法要通过类来访问。非静态方法也称为实例方法,通过类的实例来访问。示例:定义一个Student类,并定义一个计算成绩总分的方法。class Student public string sno;public string sname;public double sum(double ccj1,double ccj2)return ccj1+ccj2;【例3-1】求两个整数之和。class Program static 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);按值传递和按引用传递Swap方法代码如下:public void Swap(int a,int b)int c=a;a=b;b=c;则调用该方法的语句代码如下:S,b1);Swap方法改写如下:public void Swap(ref int a,ref int b)int c=a;a=b;b=c;则调用该方法的语句代码如下:S a1,ref b1);/在实参中增加ref关键字实践任务2v显示学生的信息,为学生类设计一个显示信息的方法。属性v属性是提供对对象或类的特性进行访问的成员。属性是字段的正常延伸都是与类型相关的有名称的成员,并且访问字段和属性的语法是相同的。v与字段不同的是:v属性不指示存储位置。作为字段的替代,为了对它们的数值进行读写,属性有访问符来指定要执行的语句。这样,属性为读写对象的属性的相关行为提供了某个机制,并且它们允许那些属性可以被计算。封装性为字段生成属性后,字段的访问修饰符就不是public了属性v属性是用相关类型成员命名的。有存取程序,它指定声明的执行来对他们的进行读或写。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索引器是属性的一种,同时本质上索引器和属性都是一种方法。v和属性的区别:数据成员是数组或者其他集合,使用索引器完成数据访问权限的控制功能。【例3-3】索引器的使用。为Cinema类添加一个索引器,用来存放当前播放的电影片名。class Cinema private string names=new string5;public string thisint n get return namesn;set namesn=value;class Program static void 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 return wheels;set wheels=value;public float Weight get return weight;set weight=value;public void Speak()Console.WriteLine(“我是0,1个轮子,重量为2吨”,type,wheels,weight);访问修饰符vpublic,访问不受限制。vinternal,访问范围限于此程序。vprotected,访问范围现定于它所属的类或从该类派生的类型。vprivate,访问范围限定于它所属的类型。类成员访问修饰符的默认值为private。使用 public 关键字 public class Sample public int x;public class MainClass public static void 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类与对象之间的关系:类就是对象的模板,而对象就是类的一个实例Carc;/声明对象c=newCar();/实例化对象Carc=newCar();【例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)类成员的定义:字段、方法和属性;v(3)访问修饰符的作用,实现程序的封装性;v(4)声明对象并实例化;v(5)通过“.”访问对象中的成员。拓展实践v设计一个时间类(Time),该类能够显示时间,并对时、分、秒做加1和减1的操作。v提示:display(),addSecond(),addMinute()单元3 面向对象的C#任务2 构造函数、静态成员和命名空间引例v描述一个长方形类,并使用该类,在使用时希望能够方便的实现长和宽值传入。知识储备v知识点1:构造函数的定义和使用,为长方形类显示声明默认构造函数。v知识点2:重载,为长方形类添加一个参数构造函数和两个参数构造函数。v知识点3:静态成员和静态类,计算生成的长方形对象的个数。v知识点4:命名空间的意义,定义命名空间的方法。知识点1:构造函数的定义和使用v构造函数是类的实例执行的时候的初始化操作。v构造函数的名称与类的名称相同。例如,如果一个类类名为Myclass,那么它的构造函数的名称是Myclass()v构造函数是在类的实例执行时初始化的方法。由于这个特性使得构造函数成为需要执行的所有初始化任务(如设置变量和属性的初始值)的理想位置。v每个类都有自己的构造函数。在访问这个类的时候系统最先执行的就是这个构造函数。v在没有定义构造函数的时候,系统会自动为我们生成一个默认构造函数使用构造函数时需要注意:v类的构造函数名要与类名相同。v构造函数没有返回类型。v一般情况下构造函数是public类型的。v不能显式的调用构造函数。classRectangle/显式声明默认构造函数publicRectangle()调用:Rectangler=newRectangle();对比方法和构造函数的定义v修饰符 返回类型 方法名(参数列表)方法功能v构造函数的定义:v修饰符 方法名(参数列表)方法功能v构造函数是没有返回类型的,且构造函数的方法名和类名相同。析构函数v析构函数是在类破坏时自动执行的操作。它在碎片收集时自动调用。v在声明析构函数时,它的标识符必须为声明析构函数的类的命名,如果指定了任何其他名称,就会发生错误。v析构函数的语法格式:v 类名()销毁实例的语法v例如,如果一个类类名为Myclass,那么它的析构函数的名称是Myclass()知识点2:重载v在一个类中定义多个方法名相同、方法间参数个数和参数类型不同的方法(对于参数个数不同或者参数列表不同的情况我们称之为参数列表不同)在同一个类中;方法名相同;参数列表不同。重载构造函数v除了系统提供的默认构造函数外,也可以根据类的需要,自定义构造函数。而且在实际情况中,构造函数往往需要使用形参。示例:创建一个长方形类对象时,需要给出长方形的长和宽。classRectangleprivatedoublelength;privatedoublewidth;publicRectangle()publicRectangle(doublelength,doublewidth)this.length=length;this.width=width;在生成具体对象时,可以在实例化对象的同时,为对象的长和宽传值:Rectangler=newRectangle(6,5)实践任务1:v定义一个快餐类,包含快餐中荤菜类型、素菜类型、是否带汤,以及价格,要求实现构造函数重载,用实现对象初始化。知识点3:静态成员和静态类v静态成员一般格式:使用static修饰符Public class A public static int count;public static void show()【例3-6】创建控制台应用程序,创建Rectangle(长方形)类,该类除包含非静态成员外,还包含一个静态数据成员用以统计长方形个数(对象个数),一个静态方法用以返回长方体个数。classRectangleprivatedoublelength;privatedoublewidth;publicRectangle(doublel,doublew)length=l;width=w;publicstaticintcount;publicstaticvoidAdd()count+;classProgramstaticvoidMain(stringargs)while(true)Console.WriteLine(请输入长方形的长:);doublel=double.Parse(Console.ReadLine();Console.WriteLine(请输入长方形的宽:);doublew=double.Parse(Console.ReadLine();Rectangler=newRectangle(l,w);Rectangle.Add();Console.WriteLine(生成长方形0个,Rectangle.count);Console.WriteLine(是否继续生成长方形(Y/N)?);if(Console.ReadLine()=N)break;静态类v静态类与非静态类基本相同,但存在一个区别:静态类不能实例化。也就是说,不能使用 new 关键字创建静态类类型的变量。v例如,如果名为StaticClass 的静态类有一个名为 MethodA 的公共方法,则按下面的示例所示调用该方法:vStaticClass.MethodA();【例3-7】实现摄氏温度和华氏温度之间的转换。publicstaticclassTemperatureConverterpublicstaticdoubleCelsiusToFahrenheit(stringtemp)doublecelsius=Double.Parse(temp);/摄氏度到华氏度的转换doublefahrenheit=(celsius*9/5)+32;returnfahrenheit;publicstaticdoubleFahrenheitToCelsius(stringtemperatureFahrenheit)doublefahrenheit=Double.Parse(temperatureFahrenheit);/华氏度到摄氏度的转换doublecelsius=(fahrenheit-32)*5/9;returncelsius;classTeststaticvoidMain()Console.WriteLine(请选择转换的方式);Console.WriteLine(1.摄氏度转换为华氏度.);Console.WriteLine(2.华氏度转换为摄氏度.);Console.Write(:);stringselection=Console.ReadLine();doubleF,C=0;switch(selection)case1:Console.Write(请输入摄氏温度:);F=TemperatureConverter.CelsiusToFahrenheit(Console.ReadLine();Console.WriteLine(对应的华氏度为:0,F);break;case2:Console.Write(请输入华氏温度);C=TemperatureConverter.FahrenheitToCelsius(Console.ReadLine();Console.WriteLine(对应的摄氏度为:0,C);break;default:Console.WriteLine(请选择一种转换方式.);break;Console.WriteLine(按任意键退出.);Console.ReadKey();实践任务2v计算生成快餐对象的个数。知识点4:命名空间的意义,定义命名空间的方法。v.NET3.5所提供的系统命名空间结构图使用命名空间组织代码v需要引用类的时候,就通过using关键字引入命名空间v定义方法示例如下:namespaceModelclassClass1classClass2 namespaceModel.Class1classClass1实践任务3v在不同的命名空间中定义同名快餐类,二者区别为构造函数不同,使用这两个类。引例分析与实现v创建控制台应用程序,创建Rectangle(长方型)类,声明长方型构造函数及正方型构造函数的重载。创建对象时,根据给定的参数个数将对象初始化为长方体或正方体。classRectangledoublelength;doublewidth;/正方形构造函数publicRectangle(doublelength)this.length=length;/长方形构造函数publicRectangle(doublelength,doublewidth)this.length=length;this.width=width;/长方形求面积方法publicdoubleArea(doublel,doublew)returnl*w;/正方形求面积方法publicdoubleArea(doublel)returnl*l;classProgramstaticvoidMain(stringargs)Console.WriteLine(请输入正方形边长:);doublel=double.Parse(Console.ReadLine();Rectangler=newRectangle(l);Console.WriteLine(正方形面积为:);Console.WriteLine(r.Area(l);Console.WriteLine(请输入长方形长:);l=double.Parse(Console.ReadLine();Console.WriteLine(请输入长方形宽:);doublew=double.Parse(Console.ReadLine();Rectangler1=newRectangle(l,w);Console.WriteLine(正方形面积为:);Console.WriteLine(r.Area(l,w);Console.ReadKey();归纳总结v知识要点:v(1)构造函数的特点:一般为public,无返回类型,方法名与类名相同;v(2)构造函数的使用,对象实例化时对成员传值;v(3)重载的概念;v(4)静态成员和静态类的关键字static;v(5)命名控件区分同名类,并层次化类。拓展实践v根据前面创建的学生类,创建两个构造函数,一个构造函数不传值,为其各属性赋默认值,另一个构造函数传4个值,分别为:姓名、年龄、班级和学号,并将传入的变量赋给对应的属性;利用循环生成10个学生对象,并求所有学生的平均年龄。单元3 面向对象的C#任务3 类的继承引例v定义一个Animal类,包含Type属性,toString()方法和sound()方法,并派生出Dog类、Cat类,派生类拥有另外一个属性Name。知识储备v知识点1:类的继承。v知识点2:继承隐私保护。v知识点3:继承时构造函数的调用。知识点1:类的继承vC#是一种面向对象的编程语言,它同样具有面向对象编程的一些特点。前面我们已经详细了解了类、对象、属性和构造函数等,它们是面向对象的基础知识,面向对象编程的更深层次的问题包括了继承性、多态性和异常等其他一些相关的知识。v继承性是从现有的类中派生出新类的功能,它能分析多态性的细微差别,并允许创建类层次结构,使用继承可以创建一个定义了多个相关项目共有特性的通用类。定义派生类v派生类能够继承基类的方法、特性等,但继承得到的成员也受作用域的限制,即使派生类继承得到基类成员,也可能无法访问。v派生类一般格式:类型修饰符 class 类名:基类名 派生类成员;示例publicclassApublicA()publicvoiddoA()publicclassB:ApublicB()publicvoiddoB()publicclassTesterpublicvoidMain()Aa=newA();Bb=newB();b.doB();b.doA();a.doA();a.doB();/非法继承Bb1=newB();Aa1=(A)b1;/B对象可以调用强制转化为A类型,因为B继承自A知识点2:继承隐私保护修饰符类内部子类其他类public可以可以可以protected可以可以不可以private可以不可以不可以说明:如果父类中的成员只允许父类独有,不允许子类或其他类访问,则使用访问修饰符private,也就是说使用了private修饰符则只能在父类中使用。如果父类中的成员,只允许父类和其派生类访问,不允许其他类访问,则在父类中用protected修饰该成员,当使用“base”关键字时,是可以访问父类成员的。实践任务1v描述一个长方体类(包含长宽高,带三个参数的构造函数,以及体积计算方法),并派生一个正方体类。知识点3:继承时构造函数的调用v构造函数调用:如果派生类的基类本身是另一个类的派生类,则构造函数的调用次序按由高到低顺序依次运行。publicclassApublicA()Console.WriteLine(A的构造函数);publicclassB:ApublicB()Console.WriteLine(B的构造函数);publicclassC:BpublicC()Console.WriteLine(C的构造函数);classProgramstaticvoidMain(stringargs)Cc=newC();Console.ReadKey();【例3-9】由长方形类派生出正方形类,正方形类的构造函数调用基类的构造函数。classRectangleprotecteddoublelength;privatedoublewidth;publicRectangle(doublel,doublew)length=l;width=w;classSquare:RectanglepublicSquare(doublel):base(l,0)publicdoubleArea()returnlength*length;classProgramstaticvoidMain(stringargs)Console.WriteLine(请输入正方形的长:);Squares=newSquare(double.Parse(Console.ReadLine();Console.WriteLine(正方形的面积为:0,s.Area();Console.ReadKey();继承的特性v1、传递性v子类的子类具备其父类以及父类父类的属性和方法。v2、单根性vC#的继承有一个很重要的特性,继承是单继承,不支持多继承,即,一个子类只能有一个父类。v3、密封性v在.NET类库中,绝大多数类可以以基类产生派生类。因为从面向对象编程的思想看,类具有开发性,即一个类为了具有很好的扩展性,是不能密封的,因为类一旦密封,则该类不再具有扩展的空间。密封类v密封类定义一般格式:访问修饰符sealedclass类名称密封方法v一般格式:public class A public sealed void show()Sealed类与方法v被声明为sealed的类不能被继承v被声明为sealed的方法不能被重写调用基类的同名方法v已替换或重写了某个方法的派生类仍可以使用 base 关键字访问基类中的该方法。在派生类中声明与基类同名的方法,也叫方法的重写。在派生类重写基类方法后,如果想调用基类的同名方法,使用base关键字publicclassApublicvoidDoWork()publicclassB:ApublicnewvoidDoWork()base.DoWork();/A类的DoWork()方法归纳总结v知识要点:v(1)派生类的定义方法;v(2)protected访问修饰符作用;v(3)继承的顺序,继承的特点子类只能继承自一个父类;v(4)构造函数和方法的继承;引例分析与实现v定义一个Animal类,包含Type属性,toString()方法和sound()方法,并派生出Dog类、Cat类,派生类拥有另外一个属性Name。并在测试类中测试定义的类。classAnimalprivatestringtype;publicstringTypegetreturntype;settype=value;publicstringtoString()return这是一个动物类;publicvoidsound()Console.WriteLine(动物声音);classCat:Animalprivatestringname;publicstringNamegetreturnname;setname=value;privatestringbreed;publicstringBreedgetreturnbreed;setbreed=value;publicstringtoString()returnCatsnameis+name+,属于+breed+,在被抚摸感到舒服的时候,会;publicvoidsound()Console.WriteLine(喵喵叫);classAnimalTeststaticvoidMain(stringargs)Animald1=newDog();Animalc1=newCat();Dogd=newDog();d.Name=吉娃娃;d.Breed=哺乳类和肉食性;Console.Write(d.toString();d.sound();Catc=newCat();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当子类中有与父类同名方法时,会出现隐藏继承的成员时,该成员的派生版本将替换基类版本。v如果基类定义了方法、字段或属性,则 new 关键字将用于在派生类中创建该方法、字段或属性的新定义。publicclassBaseCpublicstaticintx=55;publicstaticinty=22;publicvoidDoWork()Console.WriteLine(基类的方法);publicclassDerivedC:BaseCnewpublicstaticintx=100;publicnewvoidDoWork()Console.WriteLine(派生类的方法);staticvoidMain()/显示新的x的值Console.WriteLine(x);/显示隐藏的x的值Console.WriteLine(BaseC.x);/显示未隐藏的y的值Console.WriteLine(y);Console.ReadKey();();隐藏和重载的区别v隐藏是发生在父类与子类之间,在子类中重新定义父类中的方法,子类中的方法和父类的方法是一样的,包括方法名和参数列表完全相同。v重载是同一个作用域内发生(比如一个类里面),定义一系列同名方法,但是方法的参数列表不同。这样才能通过传递不同的参数来决定到底调用哪一个。而返回值类型不同是不能构成重载的。DerivedCB=newDerivedC();B.DoWork();/调用派生类方法BaseCA=(BaseC)B;A.DoWork();/调用基类方法虚方法v重写方法的一般格式:publicclassBaseclasspublicvirtualvoidshow()publicclassDerivedclass:Baseclasspublicoverridevoidshow()注意:字段不能是虚拟的;只有方法、属性、事件和索引器可以是虚拟的。overridev为了使派生类的实例完全接替来自基类的类成员,基类必须将该成员声明为虚拟的。这是通过在该成员的返回类型之前添加 virtual 关键字来实现的。然后,派生类可以选择使用 override 关键字,将基类实现替换为它自己的实现。例如:publicclassBaseCpublicintWorkField;publicvirtualvoidDoWork()publicclassDerivedC:BaseCpublicintWorkField;publicoverridevoidDoWork()DerivedCB=newDerivedC();B.DoWork();/调用派生类的方法BaseCA=(BaseC)B;A.DoWork();/同样调用派生类的方法虚拟的传递v虚拟成员保持为虚拟的。如果类 A 声明了一个虚拟成员,类 B 派生自 A,而类 C 派生自 B,则类 C 将继承该虚拟成员并可以选择重写它,而不管类 B 是否为该成员声明了 override(重写)。publicclassApublicvirtualvoidDoWork()publicclassB:ApublicoverridevoidDoWork()publicclassC:BpublicoverridevoidDoWork()()【例3-10】Rectangle类包含 x、y 两个坐标和 Area()虚方法。Circle继承 Rectangle类,为每个图形计算表面积。publicclassRectanglepublicconstdoublePI=Math.PI;protecteddoublex,y;publicRectangle()publicRectangle(doublex,doubley)this.x=x;this.y=y;publicvirtualdoubleArea()returnx*y;publicclassCircle:RectanglepublicCircle(doubler):base(r,0)publicoverridedoubleArea()returnPI*x*x;publicstaticdoubleFromArea(Rectanglere)returnre.Area();staticvoidMain()doubler=3.0,h=5.0;Rectanglerec=newRectangle(r,h);Rectanglec=newCircle(r);Console.WriteLine(AreaofRectangle=0,FromArea(rec);Console.WriteLine(AreaofCircle=0,FromArea(c);Console.ReadKey();多态的概念v多态性是面向对象程序设计中的又一个重要的概念,多态性是指通过基类引用,依靠执行多个派生类的方法,使程序执行动态操作。简单地说,多态是以同样的方法处理不同对象的能力。C#中每种类型都是多态的。知识点2:抽象类和抽象方法v如果一个基类,本身不提供已经实现的方法,只定义了所有派生类共享的一般形式,至于实现方法的内容交给派生类去填充。在这种情况下就需要一些方法来确保派生类继承并实现基类中方法的必要条件,这里我们可以使用抽象类。v抽象类不能实例化。抽象类的作用是提供可供多个派生类共享的基类的公用定义。抽象类还可以定义抽象方法。这是通过在方法的返回类型前添加关键字 abstract 实现的。抽象类v定义抽象类的一般形式如下所示:v public abstract class A 抽象方法v定义抽象方法的一般形式如下所示:v v请注意,抽象方法是没有方法体的,这和空方法体是两个不同的概念。publicabstractclassCharacterpublicabstractvoidDoWork(inti);抽象类和抽象方法使用注意:v抽象类不能实例化v要想使用抽象类,必须继承这个类,生成派生类v抽象方法没有语句块v要想使用抽象方法,必须对它进行重写v抽象方法所在的类必然是抽象类v抽象类中可以有抽象方法,也可以没有实践任务1v设计一个绘画类(DrawingBase)为抽象类,并派生出Line类和Circle类,重载Draw(),显示不同的信息。引例分析与实现v描述一个几何图形类,并派生出长方形类、正方形类、圆形类。v这里我们使用抽象来完成这个引例。请读者体会,虚方法和抽象在实现多态时的区别publicabstractclassDimensionspublicconstdoublePI=Math.PI;protecteddoublex,y;publicDimensions()publicDimensions(doublex,doubley)this.x=x;this.y=y;publicabstractdoubleArea();publicclassRectangle:DimensionspublicRectangle(doublel,doublew):base(l,w)publicoverridedoubleArea()returnx*y;publicclassCircle:DimensionspublicCircle(doubler):base(r,0)publicoverridedoubleArea()returnPI*x*x;publicclassSquare:DimensionspublicSquare(doublel):base(l,0)publicoverridedoubleArea()returnx*x;staticvoidMain()doubler=3.0,h=5.0;Dimensionsrec=newRectangle(r,h);Dimensionsc=newCircle(r);Dimensionss=newSquare(r);Console.WriteLine(AreaofRectangle=0,c.Area();Console.WriteLine(AreaofCircle=0,rec.Area();Console.WriteLine(AreaofSquare=0,s.Area();Console.ReadKey();归纳总结v知识要点:v(1)方法隐藏,关键字new;v(2)虚方法实现多态;v(3)抽象类和抽象方法。拓展实践v定义抽象类Pet(宠物)类为基类,类中定义两个私有字段毛色和年龄,定义虚方法完成宠物的自我介绍功能;定义两个派生类Cat和Dog,重写基类方法;定义包含主方法的类MainClass,调用派生类的重写方法。单元3 面向对象的C#任务5 接口引例v设计一个遥控器,分别实现电视机遥控和DVD的遥控。知识储备v知识点1:接口的定义。v知识点2:接口的使用。知识点1:接口的定义v接口用来定义一种程序的协定。它包含属性、方法、事件和索引器。接口本身不提供它所定义的成员的实现。接口只指定实现该接口的类或接口必须提供的成员,所以接口不能被实例化。v接口是使用 interface 关键字定义的修饰符 interface 接口名称:继承的接口列表 /接口内容interfaceIComparableintCompareTo(objectobj);接口与抽象类抽象类抽象类接口接口可以具有实现代码是完全抽象的用于为相关派生类提供公用方法签名,以及公用方法和实例变量用于表示一组抽象行为,这些行为可以由不相关的类实现可以包含实例变量不能包含实例常量接口可以包含事件、索引器、方法和属性,但接口中不能包含字段。同样,接口不能包含方法