类的继承、多态和接口继承的出现(I)classStudent{publicintid=3;publicstringname=Tom;publicvoidSelfIntr(){Console.WriteLine(id+:+name);}}classPupil{publicintid=3;publicstringname=Tom;publicvoidSelfIntr(){Console.WriteLine(id+“:+name);}publicvoidGame(){Console.WriteLine(我喜欢玩皮球!);}}新类比原类多了一个方法继承的出现(II)classStudent{publicintid=16;publicstringname=Tom;publicvoidSelfIntr(){Console.WriteLine(id+\t+name);}}classPupil:Student{publicvoidGame(){Console.WriteLine(我喜欢玩皮球!);}}使用:继承原有类的内容,再另行添加新的内容,简化了代码的编写,这就是继承!父类、基类或超类子类或派生类继承的特点•不支持多重继承,可以有多层继承•子类不继承父类的私有成员和构造方法•默认情况下,子类调用父类中无参构造方法•如果在父类中定义了带参构造方法,那么在创建子类对象时可能会出现错误•在子类构造方法的括号后面使用:base()调用父类的构造方法访问控制修饰符(I)附:还有一种protectedinternal修饰符,可以在本类、派生类及所属文件(程序集)中访问修饰符说明public在程序的任何位置都可以访问protected只能在本类和子类中访问(见示例)internal在同一个程序集中可以访问private只能在本类中访问(默认)访问控制修饰符(II)classF{publicinta;internalintb;protectedinternalintc;protectedintm;privateintn;}classS1:F{a—√b—√c—√m—√n—×}classT1{a—√b—√c—√m—×n—×}classS2:F{a—√b—×c—√m—√n—×}classT2{a—√b—×c—×m—×n—×}文件f1文件f2virtual与override•在父类中被允许重写的方法以virtual来修饰,子类中的同名方法用override来进行重写以实现多态•用virtual修饰的方法称为“虚方法”,它仅表示该方法可以被子类重写•virtual不能与private、override、abstract和static等修饰符同时使用•override不能与new、static、virtual同时使用见示例:父类对象指向子类对象空间•父类对象可以调用子类对象中继承的、且还未被隐藏(或重写)的成员•如果父类中的方法被子类用override所重写,那么父类将调用子类重写后的方法•如果在子类中用new创建了与父类同名的成员,那么父类将无法识别子类新创建的成员,而仍然调用本类原有的成员见示例:多态的应用•由于子类对父类的方法进行了重写,我们可以根据程序设计的需要通过父类对象去调用不同子类中的方法•创建一个父类对象的数组,数组的个数可以和子类的个数相同,每个下标都对应一个子类对象,根据下标值的变化去调用子类对象所各自重写的方法父类对象强制转换为子类对象•当父类对象指向一个子类对象的空间时,虽然是父类对象在操纵这一空间,但该空间的实质还是子类的,因此,完全可以把这个父类对象强制转换成子类对象classFather{publicintnum=2;}classSon:Father{publicintcnt=9;}staticvoidMain(){Fatherf=newSon();//f是父类对象,不能操纵子类中的cntConsole.Write(f.cnt);//将报错//将f强制转换后,就可以使用cnt了Console.Write(((Son)f).cnt);}抽象类和抽象方法•使用abstract关键字来创建一个抽象类或是抽象方法•抽象类不能被实例化•不能创建抽象的构造方法•抽象方法没有具体功能实现•抽象方法由本类的子类去实现,子类中需要使用override关键字CTS根类型:Object•C#中的任何类型都是从object类继承而来的,object其实是System.Object的别名,System.Object也是.NET类库中所有类型的始祖,包括值类型和引用类型,都是直接或间接从System.Object继承而来的System.Object引用类型System.ValueType引用类型值类型接口:interface•如果一个类中的所有方法都没有被实现,那么这个类就可以被声明为“接口”•接口中的成员都默认为public,但不能使用public•C#接口中不能声明成员变量(常量)•类也可以在继承父类的同时,实现多个接口,多个接口之间以“,”隔开•接口名习惯上以大写字母I开头见示例:接口的实际应用•接口提供了一个统一的标准,所有继承接口的类都必须要遵循这一标准•实现接口可以大大减轻程序开发的负担,提高了灵活性和扩展性•在接口的使用中,要清晰地掌握父类对象指向子类对象空间这一点Convert类•Convert类中的所有方法都是静态的,其作用是要将一种基本数据类型转换成另一种数据类型•其中的以ToXXX为前缀的方法中,XXX指的是CTS类型的名称,如:int为Int32string为Stringfloat为SingleMath类•Math类静态的形式提供了进行数学运算的方法,如:Abs(value):求value的绝对值Ceiling(value):求大于或等于value的最小整数Flooring(value):求小于或等于value的最大整数\Max(value1,value2):求两个数中的最大数Min(value1,value2):求两个数中的最小数Pow(x,y):求x的y次幂Sqrt(value):求value的平方根PI:返回圆周率的值Random类•Random类中的方法可用于产生随机数,我们需要创建一个该类的对象调用其方法:Randomrd=newRandom();rd.Next():它返回一个小于2,147,483,647的非负数rd.Next(intvalue):它返回一个小于指定值value的非负数rd.Next(a,b):它返回一个介于a与b之间的随机数rd.NextDouble():返回一个介于0.0和1.0之间的随机数日期/时间类型•在C#中,使用System.DateTime结构描述日期和时间•在DateTime结构中有静态属性Now用来表示系统当前的日期/时间,Today用来表示当前的日期•其它的非静态属性有:Year-年Month-月Day-日Hour-时Minute-分Second-秒Date-获取实例的日期部分DayOfYear-返回一年当中的第几天DayOfWeek-星期几创建DateTime实例•构造方法的重载形式有:DateTime(intyear,intmonth,intday)DateTime(year,month,day,hour,minute,second)DateTime(年,月,日,时,分,秒,毫秒)DateTime(Int64):以1年1月1日的千万分之一秒为单位此外,还可以使用System.Globalization.Calendar类的对象作为DateTime构造方法的最后参数•staticvoidMain(string[]args)•{•Console.WriteLine(DateTime.Today);//输出当前的日期•Console.WriteLine(DateTime.Now);•//DateTimedt=DateTime.Now;//将当前的日期/时间赋值给DateTime结构对象•DateTimedt=newDateTime(2008,8,8);//用指定的日期/时间创建DateTime结构对象•Console.WriteLine(dt.Year);•Console.WriteLine(dt.Month);•Console.WriteLine(dt.Date);•Console.WriteLine(dt.Day);•Console.WriteLine(dt.DayOfWeek);•Console.WriteLine(dt.DayOfYear);•}