03.基于C#面向对象程序设计_第1页
03.基于C#面向对象程序设计_第2页
03.基于C#面向对象程序设计_第3页
03.基于C#面向对象程序设计_第4页
03.基于C#面向对象程序设计_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于WinForm医用仪器软件设计MedicalInstrumentSoftwareDesignQuickStartTutorial2022讲师xxx03基于C#的面向对象程序设计章节目录Tableofcontents

类的封装实验类的继承实验

类的多态实验抽象类实验接口实验0102040305命名空间实验06异常处理实验07先导知识·面向过程和面向对象面向过程面向对象编程思想过程为中心事物为中心函数组织代码按步骤解决问题用类组织代码以分类的方式解决问题特点优点性能高易维护,易使用,易扩展相辅相成,并不对立。整体上用面向对象把控,细节上用面向过程解决。先导知识·类与对象类是抽象的概念集合,表示的是一个共性的产物,类中定义的是属性和行为(方法);对象是一种个性的表示,表示一个独立而具体的个体。类与对象是面向对象中最基本的组成单元。类是对象的模板,对象是类的实例。对象是可以直接使用的。类不能直接使用,只有通过实例化对象才可以使用。举例在C#中,属性是以成员变量的形式定义的,行为是以方法的形式定义的,而类包括对象的属性和方法。举例publicclassHamburgerShop{publicHamburgerShop{//构造方法}publicintmBurgerType;//汉堡种类publicintmBurgerSize;//汉堡尺寸publicintmBurgerLayer;//汉堡层数privateintmBakingTime;//烘烤时间

//选择汉堡

publicvoidselectBurger(){}//支付费用

publicvoidpay(){}//制作汉堡

privatevoidmakeBurger(){}//交付汉堡

publicvoiddeliverBurger(){}}先导知识·类类包含的变量类型(1)成员变量:成员变量是定义在类体中,方法体之外的变量。这种变量在创建对象的时候实例化。成员变量可以被类中方法、构造方法和特定类的语句块访问。(2)局部变量:在方法(包含构造方法)和语句块中定义的变量被称为局部变量。这种变量声明和初始化都是在方法中,方法结束后,变量就会自动销毁。(3)类变量:类变量也声明在类体中,方法体之外,但必须声明为static类型。这种变量也称为静态变量。先导知识·类类的成员方法和构造方法(1)成员方法成员方法对应类的行为,例如汉堡店类中的selectBurger()、publicvoidpay()等方法。参数个数:0-N个参数类型:对象或基本数据类型返回值:可有/无void

返回值类型:计算结果或其他数值及对象(2)构造方法构造方法是一个与类同名的方法,例如汉堡店类中的HamburgerShop()方法,对象的创建就是通过构造方法完成的。每个类都有构造方法,类实例化一个对象时,类都会自动调用构造方法。返回值:无

隐式定义:编译器提供一个默认的无参构造方法显式定义:一个类可以定义多个构造方法注:若定义了构造方法,将不再提供默认的构造方法。如果定义了带参构造方法,还要使用无参构造方法,就必须再写一个无参构造方法。建议时刻保留无参构造方法的存在。先导知识·访问修饰符C#中常见的访问修饰符包括private、public、protected和internal,这些修饰符控制着对类、类的成员变量及成员方法的访问,修饰符权限如下表所示。访问修饰符说明public公有访问。不受任何限制private私有访问。只限于本类成员访问,子类和实例都不能访问protected保护访问。只限于本类和子类访问,实例不能访问internal内部访问。只限于本项目内访问,其他不能访问先导知识·对象的创建、操作和销毁对象是根据类创建的。创建对象需要以下3步:①声明:声明一个对象,包括对象名称和对象类型;②实例化:使用关键字new来创建一个对象;③初始化:使用new创建对象时,会调用构造方法初始化对象。创建方式如下:Personp=newPerson();对象类型对象名称实例化构造方法(初始化)每个对象都有生命周期,当对象的生命周期结束时,分配给该对象的内存地址将会被回收。C#拥有一套完整的回收机制.类的封装实验EncapsulationexperimentforClass实验内容创建ConvertTime类,在类中定义一个CalcTime类,进一步在CalcTime类中依次定义:用于指定小时值、分钟值和秒值的常量TIME_VAL_HOUR、TIME_VAL_MIN和TIM_VAL_SEC;用于保存小时值、分钟值和秒值的成员变量mHour、mMin和mSec;用于计算小时值、分钟值和秒值的calcHour()、calcMin()和calcSec()方法;用于计算三个时间值的calcTimeVal()方法;用于获取三个时间值的getTimeVal()方法。其中,calcTimeVal()和getTimeVal()方法,及三个常量用public修饰,其余的成员变量和成员方法均用private修饰。在Main()方法中获取键盘输入值(0~86399之间的值,包括0和86399),然后,实现秒值-时间值转换,并输出转换结果。实验原理1、类的封装封装是指一种将抽象性方法接口的实现细节部分包装、隐藏起来的方法。封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。实现封装的步骤分为两步:①将属性私有化:利用权限修饰符(一般为private)来控制权限,防止被随意获取②提供对外的公共方法访问:创建一对赋取值方法,用于对私有属性的访问。类的封装实验EncapsulationexperimentforClass封装的优点:①减少耦合②自由修改内部结构③精确控制成员变量④隐藏信息,实现细节。实验剖析类的封装实验EncapsulationexperimentforClass①创建类CalcTime:常量:TIME_VAL_HOUR、TIME_VAL_MIN、TIM_VAL_SEC变量:mHour、mMin、mSec方法:calcHour()、calcMin()、calcSec()、calcTimeVal()、getTimeVal()②在ConvertTime类中,实例化Calc类,定义计算和展示时间的方法③在Main()中实例化ConvertTime类并调用展示方法实验内容创建ConvertTime类,在类中定义一个父类CalcTime,在父类中依次定义用于指定小时值、分钟值的常量TIME_VAL_HOUR和TIME_VAL_MIN;用于保存小时值和分钟值的成员变量mHour和mMin;用于计算小时值和分钟值的calcHour()和calcMin()方法。然后定义一个继承父类的CalcAllTime子类,在子类中定义用于指定秒值类型的常量TIME_VAL_SEC;用于保存秒值的成员变量mSec;用于计算秒值的calcSec()方法。最后,重写用于计算时间值的calcTimeVal()方法和获取时间值的getTimeVal()方法。在ConvertTime类中,通过new操作符创建一个CalcAllTime型对象,该对象名为cat,然后,在ConvertTime类中定义一个用于计算和显示时间的dispTime()方法。在Main()方法中获取键盘输入值(0~86399之间的值,包括0和86399),然后,实现秒值-时间值转换,并输出转换结果。类的继承实验

InheritanceexperimentforClass实验原理1、类的继承继承是一种新建类的方式,新建的类称为子类,被继承的类称为父类,继承可以使得子类具有父类的属性和方法,还可以在子类中重新定义追加属性和方法。例如,看门犬:性别身长行走奔跑看门牧羊犬:性别身长行走奔跑牧羊抽取出共同的属性和方法—犬类属性:性别身长方法:行走奔跑类的继承实验

InheritanceexperimentforClass实验原理2、继承的优点和缺点类的继承实验

InheritanceexperimentforClass缺点①继承是侵入性的,子类必须拥有父类的所有属性和方法;②子类拥有父类的属性和方法,增加了子类代码的约束,降低了代码的灵活性;③当父类的常量、变量和方法被修改时,需要考虑子类的修改,而且在缺乏规范的环境下,这种修改可能带来大段代码需要重构的后果,增强了代码的耦合性。优点①代码冗余度低,开发时间短;②代码扩展性高,系统开发灵活性强;③代码重用性高,系统出错概率低。实验原理3、继承的实现protected:只有派生类才能访问protected成员。子类不能继承父类的构造函数。在子类实例化对象的过程中,子类先默认执行父类的无参构造函数,再执行自己的构造函数。当父类是有参构造函数时,子类必须显式调用父类的构造函数,使用到base关键词。子类重新实现父类的方法分为override(重写)和new(覆盖)两种方法,使用override重新实现父类时,父类方法必须用virtual修饰,表示这个方法是虚方法,可以被重写。实例如下:类的继承实验

InheritanceexperimentforClasspublicclassDog//父类{privateintsex;privateintlength;publicDog(intdogSex,intdogLength)

//父类有参构造函数

{//初始化属性值

}publicvoidwalk(){Console.WriteLine("Dogiswalking.");

}//重写对应虚函数

publicvirtualvoidrun(){Console.WriteLine("Dogisrunning.");

}/*覆盖无需虚函数

publicvoidrun(){Console.WriteLine("Dogisrunning.");}*/}publicclassWatchDog:Dog//子类{//调用父类构造方法

publicWatchDog(intdogSex,intdogLength):base(dogSex,dogLength){}//重写

publicoverridevoidrun()

{//重写父类方法Console.WriteLine("WatchDogisrunning.");

}

/*覆盖示例

publicnewvoidrun(){//重写父类方法Console.WriteLine("WatchDogisrunning.");}*/publicvoidwatchDoor(){this.run();//调用子类成员方法

Console.WriteLine("WatchDogiswatchingdoor.");}}实验剖析①创建父类CalcTime:常量:TIME_VAL_HOUR、TIME_VAL_MIN变量:mHour、mMin方法:calcHour()、calcMin()、calcTimeVal()、getTimeVal()②创建子类CalcAllTime:常量:TIME_VAL_SEC变量:mSec方法:calcSec()、calcTimeVal()、getTimeVal()类的继承实验

InheritanceexperimentforClass③在ConvertTime类中,实例化CalcAllTime类,定义计算和展示时间的方法④在Main()中实例化ConvertTime类并调用展示方法类的多态实验

PolymorphismexperimentforClass实验内容创建ConvertTime类,在类中定义一个DispTime类,之后在DispTime类中定义一个虚方法dispTime()。然后创建一个继承DispTime类的CalcTime子类,进一步在CalcTime类中依次定义用于保存小时值、分钟值和秒值的成员变量mHour、mMin和mSec;用于计算小时值、分钟值和秒值的calcHour()、calcMin()和calcSec()方法,并重写dispTime()方法。其中calcHour()、calcMin()、calcSec()和dispTime()方法用public修饰,其余的成员变量和成员方法均用private修饰。在Main()方法中获取键盘输入值(0~86399之间的值,包括0和86399),然后,实现秒值-时间值转换,并输出转换结果。实验原理1、类的多态性多态性是指在父类中定义的属性和方法被子类继承后,可以具有不同的数据类型或表现出不同的行为。类的多态实验

PolymorphismexperimentforClass类的多态性可以体现为:①重载式多态,也叫编译时多态,这种多态在编译时已经确定好调用哪个方法了;②重写式多态,也叫运行时多态,这种多态只有程序运行时,才知道调用的是哪个子类的方法。③父类引用指向子类对象,当这个对象需要调用的方法在父类和子类中都存在时,默认调用子类中的方法;若只存在于父类或子类中时,则调用对应类中的方法。动物会叫,猫会喵喵叫,狗会汪汪叫猫cat=new猫();cat.call();猫会喵喵叫动物animal=new猫();animal.call();猫是动物,会喵喵叫动物animal=new狗();animal.call();狗是动物,会汪汪叫实验原理2、重载与重写的区别重载要求“两同一不同”:①同一个类中方法名相同;②参数不同。参数不同包括:参数个数不同参数类型不同参数顺序不同(很少使用)

重写需要遵循以下规则:①父类方法与子类重写的方法中参数、返回值类型与方法名必须相同;②子类重写的方法不能拥有比父类方法更低的访问权限,当父类中方法的访问权限修饰符为private时,该方法在子类中是不能被重写的;③如果父类方法抛出异常,那么子类重写的方法也要抛出异常,而且抛出的异常不能多于父类中抛出的异常。类的多态实验

PolymorphismexperimentforClass实验剖析①创建父类DispTime,定义一个虚方法dispTime()②继承父类创建CalcTime子类,重写dispTime()③在Main()中实例化一个父类指向子类的对象,通过这个对象调用dispTime方法实现时间值的转换类的多态实验

PolymorphismexperimentforClass抽象类实验

ExperimentforAbstractClass实验内容创建ConvertTime类,在类中定义一个Time抽象类,在抽象类中依次定义用于保存小时值、分钟值和秒值的成员变量mHour、mMin和mSec,及用于显示时间的dispTime()方法,该方法为抽象方法。然后定义一个继承抽象类的CalcTime子类,在子类中定义用于计算小时值的calcHour()方法,用于计算分钟值的calcMin()方法,用于计算秒值的calcSec()方法,最后,重写用于显示时间的dispTime()方法。在ConvertTime类中,通过new操作符创建一个CalcTime型对象,该对象名为ct,然后,在ConvertTime类中定义一个用于计算和显示时间的calcDispTime()方法。在Main()方法中获取键盘输入值(0~86399之间的值,包括0和86399),然后,实现秒值-时间值转换,并输出转换结果。实验原理1、抽象类抽象类也是类,当有一些情况只知道一个类需要哪些属性和方法,不知道这些方法具体是什么,就需要用到抽象类。2、抽象方法一个类中的方法的具体实现由它的子类确定,可以在父类中声明该方法为抽象方法。定义抽象类的语法如下:[权限修饰符]abstractclass类名{//类体}关键字:abstract

定义抽象方法的语法如下:[权限修饰符]abstract

返回值类型方法名(参数列表);抽象类实验

ExperimentforAbstractClass实验原理抽象类有以下规定:(1)抽象类不能被实例化,非抽象子类可以。(2)有抽象方法的类一定是抽象类。(3)抽象类中的抽象方法只是声明,不包含方法体。(4)构造方法和类方法(用static修饰的方法)不能声明为抽象方法。(5)抽象类的子类必须给出抽象类中抽象方法的具体实现,除非该子类也是抽象类。抽象方法有以下规定:(1)抽象方法后面直接跟一个分号,而不是花括号。(2)抽象方法的修饰符必须为public或protected(为private不能被子类继承),默认情况下为public。(3)任何子类必须重写父类的抽象方法,或者声明该子类为抽象类。抽象类实验

ExperimentforAbstractClass实验剖析①创建抽象类Time:变量:mHour、mMin和mSec抽象方法:dispTime()

②创建继承Time抽象类的CalcTime子类③在ConvertTime()中实例化Calc对象,定义calcDispTime方法抽象类实验

ExperimentforAbstractClass接口实验Interfaceexperiment实验内容创建ConvertTime类,在类中定义一个接口ITime,在接口中依次定义小时、分钟、秒值的默认值DEFAULT_HOUR、DEFAULT_MIN和DEFAULT_SEC;用于显示时间的dispTime()方法,该方法为抽象方法。然后定义一个实现接口ITime的CalcTime类,在该类中定义用于保存小时值、分钟值和秒值的成员变量mHour、mMin和mSec;用于计算小时值、分钟值和秒值的calcHour()、calcMin()和calcSec()方法;最后,重写用于显示时间的dispTime()方法。在ConvertTime类中,通过new操作符创建一个CalcTime型对象,该对象名为ct,然后,在ConvertTime类中分别定义一个用于计算和显示时间的calcDispTime()方法。在Main()方法中获取键盘输入值(0~86399之间的值,包括0和86399),然后,实现秒值-时间值转换,并输出转换结果。实验原理1、接口接口是抽象类的延伸,通常用interface来声明。接口不是类,接口包含类要实现的方法。接口无法被实例化,但接口可以被实现。例如,鸟都有fly()和eat()两个行为,可以定义一个接口,如下: publicinterfaceBird{

publicabstractvoidfly();

publicabstractvoideat(); }关键字:interface

接口实验Interfaceexperiment实验原理2、抽象类和接口的区别类的继承和接口的实现都用到“:”,抽象类与接口的区别如下:(1)抽象类可以包含构造方法,接口没有构造方法。(2)抽象类既可以有抽象方法也可以有非抽象方法,接口中的方法必须是抽象方法。(3)抽象类中的成员变量可以是各种类型,而接口中的成员变量只能是静态常量。(4)抽象类可以包含静态代码块和静态代码,而接口中不能包含。(5)一个类只能继承一个抽象类,但可以实现多个接口。接口实验Interfaceexperiment抽象类对类抽象,包括属性、行为接口对行为抽象实验原理3、接口的定义与实现接口中的变量会被隐式地指定为publicconst变量,必须给出初始值,绝对不会被修改;接口中的方法会被隐式地指定为publicabstract方法,只能是publicabstract方法;接口中所有的方法不能有具体的实现,即接口中的方法必须都是抽象方法。定义接口时,需要使用interface关键字,语法如下:[权限修饰符]interface接口名{[public][const]常量;[public][abstract]方法;}接口实验Interfaceexperiment实验1剖析①定义接口Itime,接口中定义用与显示时间的dispTime()抽象方法②创建实现Itime接口的CalcTime子类③在ConvertTime类中实例化一个CalcTime对象,然后定义一个calcDispTime()方法用于计算和显示时间接口实验Interfaceexperiment实验2剖析①定义接口ITime,接口中定义用与显示时间的dispTime()抽象方法②在定义接口ICalc,单独定义计算时间值的方法:③创建一个实现ITime接口和ICalc接口的CalcTime子类④在ConvertTime类中实例化一个CalcTime对象,然后定义一个calcDispTime()方法用于计算和显示时间接口实验Interfaceexperiment命名空间实验Namespaceexperiment实验内容创建CalcTime类,该类位于命名空间ConvertT.leyutek.calc中,在CalcTime类中依次定义用于指定小时值、分钟值和秒值的常量TIME_VAL_HOUR、TIME_VAL_MIN和TIM_VAL_SEC;用于保存小时值、分钟值和秒值的成员变量mHour、mMin和mSec;用于计算小时值、分钟值和秒值的calcHour()、calcMin()和calcSec()方法;用于计算三个时间值的calcTimeVal()方法;用于获取三个时间值的getTimeVal()方法。其中,calcTimeVal()和getTimeVal()方法,及三个常量用public修饰,其余的成员变量和成员方法均用private修饰。新建一个ConvertTime类,通过using导入CalcTime类包,并在ConvertTime类中通过new操作符创建一个CalcTime型对象,该对象名为ct,然后,在ConvertTime类中定义用于计算和显示时间的dispTime()方法。在Main()方法中获取键盘输入值(0~86399之间的值,包括0和86399),然后,实现秒值-时间值转换,并输出转换结果。实验原理1、C#命名空间命名空间可以较好的管理类代码,避免命名冲突带来的问题。学生类学生类工学院商学院解决命名冲突关键字:

using命名空间的导入using

[命名空间名];命名空间的定义namespace

[命名空间名]{[代码]}关键字:namespace命名空间实验Namespaceexperiment实验剖析①

将计算时间的类CalcTime归属于ConvertT.leyutek.calc命名空间②在ConvertTime类中using导入ConvertT.leyutek.calc命名空间中的CalcTime类③在ConvertTime类中实例化一个CalcTime对象,定义一个dispTime()方法用于计算和显示时间命名空间实验Namespaceexperiment异常处理实验Exceptionhandlingexperiment实验内容创建TickException自定义异常类,实现构造方法。然后,创建ConvertTime类,在该类中依次定义用于保存小时值、分钟值和秒值的成员变量mHour、mMin和mSec;用于计算和显示时间值的calcTimeVal()方法,如果tick值小于0或大于86399,通过throw实例化TickException自定义异常类。在Main()方法中获取键盘输入值(0~86399之间的值,包括0和86399),然后,在try语句中通过调用ct对象的calcTimeVal()方法计算和显示时间值,在catch语句中输出异常信息,最后,在finally语句中关闭控制台输入对象。实验原理1、C#异常处理即在可能出现错误的地方,编写完善的代码来处理错误和异常,避免程序中断。2、C#异常类型C#中所有的异常类都是System.Exception的直接或间接子类,这些异常类包含了异常的相关信息。常见的异常如下表:异常处理实验Exceptionhandlingexperiment实验原理常见异常类型异常类描述System.ArithmeticException在算术运算期间发生的异常System.ArrayTypeMismatchException存储一个数组时,被存储的元素的实际类型与数组的实际类型不兼容导致存储失败而引发的异常System.DivideByZeroException在试图用零除整数值时引发System.IndexOutOfRangeException在试图使用小于零或超出数组界限的下标索引数组时引发System.InvalidCastException当从基类或派生类的显示转换在运行时失败,就会引发此异常System.NullRefferenceException在需要使用引用对象的场合,如果使用null引用,就会引发此异常System.OutOfMemoryException在分配内存的尝试失败时引发System.OverflowException在选中的上下文中所进行的算术运算、类型转换或转换操作导致溢出时引发的异常System.StackOverflowException挂起的方法调用过多而导致执行堆栈溢出时引发的异常System.TypeInitializationException

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论