




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
主讲教师:本课学时:联系方式:C#程序设计教程第四章面向对象编程基础
本章主要内容介绍
4.1面向对象概念
4.2类
4.3方法
4.4属性
4.5类库与命名空间
4.6小结CONTENT本章学习目标:
熟练掌握类的定义与使用熟练掌握类的字段熟练掌握类的构造函数熟练掌握类的方法的定义和使用掌握类属性的定义和使用面向对象的基本概念对象类实体抽象数据类概念世界现实世界计算机世界抽象实例化抽象计算机逻辑实现映射对象属性型号价格里程行为起动停车行驶属性车轮数量档的数量行为加速换档刹车属性名称颜色品种行为摇尾巴吃东西犬吠现实世界中某个具体的物理实体在计算机逻辑中的映射和体现对象属性型号价格里程行为起动停车行驶属性车轮数量档的数量行为加速换档刹车属性名称颜色品种行为摇尾巴吃东西犬吠现实世界中某个具体的物理实体在计算机逻辑中的映射和体现类类是C#中的一种结构,用于在程序中模拟现实生活的事物语法:[访问修饰符]class<类名>{//类的主体}示例:classEmployee{//类的主体}//成员变量//成员方法类与对象类是一种抽象的数据类型将类实例化成对象后方可使用C#中用new运算来创建对象EmployeeobjEmployee;objEmployee=newEmployee();
Form1frm=newForm1();frm.Show();
面向对象的程序设计(OOP)是一种基于结构分析的、以数据为中心的程序设计方法。
面向对象的程序设计方法总体思路:将数据及处理这些数据的操作都封装(Encapsulation)到一个称为类(Class)的数据结构中,在程序中使用的是类的实例——对象。
对象是代码与数据的集合,是封装好了的一个整体,对象具有一定的功能。也就是说对象是具有一定功能的程序实体。程序是由一个个对象构成的,对象之间通过一定的“相互操作”传递消息,在消息的作用下,完成特定的功能。
面向对象的基本概念面向对象程序设计语言的三大原则
1.一切都是对象2.计算通过对象间相互通信,请求其他对象执行动作来实现。对象间通过发送和接收消息来通信3.每个对象都有自己的内存,其中可能包括了其他的对象。面向对象程序设计语言的三大原则封装性封装(encapsulation):利用ADT将数据和基于数据的操作密封在一起,系统的其它对象只能通过界面与其交互。封装机制将数据和代码捆绑到一起,避免了外界的干扰和不确定性。封装的优点提高了系统灵活性提高了系统安全性面向对象程序设计语言的三大原则继承性继承(Inheritance)是可以让某个类型的对象获得另一个类型的对象的属性的方法。继承支持按级分类的概念。继承很好的支持代码的重用性(reusability)。
面向对象程序设计语言的三大原则多态性多态(Polymorphism):多态的意思是事物具有不同形式的能力。例如,对不同的实例,某个操作可能会有不同的行为。这个行为依赖于所要操作数据的类型。多态机制使具有不同内部结构的对象可以共享相同的外部接口。多态的实现重载(overload)覆盖(override)4.2类
publicclassteacher{intno;stringname;publicintNo{get{returnno;}set{no=value;}}publicstringName{get{returnname;}
set{name=value;}}
publicteacher() { // //TODO:Addconstructorlogichere // }publicteacher(intno,stringname){this.no=no;=name;}}4.2类
C#2008秉承了C++面向对象的所有关键概念:封装、继承和多态性。其类型模型是建立在.NET虚拟对象系统之上的。类是面向对象的程序设计的基本构成模块。从定义上讲,类是一种数据结构,这种数据结构可以包含数据成员、函数成员等类型。其中数据成员类型有常量和事件;函数成员类型有方法、属性和索引器等。定义类的语法语法
[修饰符]class
类名[:基类]{
……
}类声明中的修饰符修饰符说明interal(默认)访问修饰符,在同一个程序集中可以访问public访问修饰符,任何地方都可访问abstract抽象类,不能实例化sealed密封类,不能被继承static静态类,不能实例化,不能被继承partial部分类,一个类的代码可以放在多个文件中,编译时再将它们合并类的成员类成员说明常量与类相关的常量值字段类中的变量方法类中的函数,完成特定的功能属性对类的字段提供安全访问事件用于说明发生了什么事情索引器像使用数组那样访问类的数据运算符定义类所特有的运算构造函数和析构函数对类的实例进行初始化和销毁语法:字段(成员变量)[访问修饰符]数据类型成员变量;privateprotectedinternalpublic_namestatus….userNameintchar….bool…classEmployee{ privatestring_name; privatechar_gender; privatestring_qualification; privateuint_salary;}…访问成员变量步骤1:创建一个类的对象EmployeeobjEmployee=newEmployee();步骤2:使用点号访问成员变量objEmployee._name=“张三";objEmployee._name='M';字段(成员变量)字段的类型可以是C#中任何数据类型5种访问修饰符对字段都适用(默认为private)访问修饰符1Teacher类private成员protected成员public成员internal成员Student类只有Student类在Teacher类都在同一程序集中,才可访问internal成员不可访问不可访问可以访问访问修饰符2修饰符说明public所属类的成员以及非所属类的成员都可以访问internal当前程序集可以访问private只有所属类的成员才能访问Protectedinternal访问限于此程序或从该成员所属的类派生的类型protected所属类或派生自所属类的类型可以访问静态字段例publicclassemployee{publicstaticintid;publicstringname;publicstaticintemployeecounter;publicstaticintaddemployee(){returnemployeecounter++;}}classProgram{staticvoidMain(string[]args){employee.employeecounter=0;employeee1=newemployee();employee.addemployee();employeee2=newemployee();employee.addemployee();Console.WriteLine("employeecount:{0}\n",employee.employeecounter);Console.ReadLine();}}运行结果:非静态字段publicclassemployee{publicstaticintid;publicstringname;publicintemployeecounter;publicvoidaddemployee(){employeecounter++;Console.WriteLine("employeecount:{0}",employeecounter);}}classProgram{staticvoidMain(string[]args){employeee1=newemployee();e1.employeecounter=100;Console.WriteLine("employeecount:{0}",e1.employeecounter);employeee2=newemployee();e2.addemployee();Console.ReadLine();}}运行结果:静态与非静态字段静态字段的定义用static关键字有效范畴静态字段属于类,是类的所有对象所共用的非静态字段(实例字段)属于对象,是某个特定对象专用的引用方法类名.静态字段对象名.非静态字段publicclassemployee{publicstaticintid;publicstringname;publicintemployeecounter;}字段的初始化classProgram{staticvoidMain(string[]args){employee.id=10;Console.WriteLine("id:{0}\n",employee.id);employeee1=newemployee();e1.employeecounter=100;Console.WriteLine("employeecount:{0}\n",e1.employeecounter);Console.ReadLine();}}运行结果:字段的初始化声明时自动初始化自动初始化的默认值声明时用赋值语句初始化赋值语句的执行静态字段非静态字段非静态字段的初始化问题构造函数构造函数是类的一种特殊方法,每次创建类的实例都会调用它[访问修饰符]<类名>(){//构造函数的主体}语法:…//默认构造函数Employee(){ _qualification="研究生"; }…示例:演示:示例1构造函数classEmployee{
publicstring_name;publicchar_gender;publicstring_qualification;publicuint_salary;
//默认构造函数
public
Employee()
{_qualification=“研究生";
}
staticvoidMain(string[]args)
{ //调用默认构造函数
EmployeeobjEmployee=newEmployee();Console.WriteLine(“资格=" +objEmployee._qualification);Console.WriteLine(“薪水=" +objEmployee._salary);
}}输出结果:构造函数构造函数是一种特殊的方法特殊的声明方法名与类同名没有返回类型特殊的执行每次用new关键字创建类的实例时自动执行不能直接调用构造函数特殊的用途初始化对象参数化构造函数[访问修饰符]<类名>(){//构造函数的主体}语法:([参数列表])…//参数化构造函数Employee(stringstrQualification){_qualification=strQualification; }…示例:参数化构造函数//默认构造函数privateEmployee(){_qualification=“研究生";}//参数化构造函数publicEmployee(stringstrQualification,stringstrName,chargender,uintempSalary){_qualification=strQualification;_name=strName;_gender=gender;_salary=empSalary;}publicstaticvoidMain(string[]args){
//调用默认构造函数EmployeeobjGraduate=newEmployee();//调用参数化构造函数EmployeeobjMBA=newEmployee("ACCPS3","张亮影",'男',5500);Console.WriteLine("默认构造函数输出:\n资格="+objGraduate._qualification);Console.WriteLine("\n参数化构造函数输出:\n资格="+objMBA._qualification);Console.ReadLine();}输出结果:
缺省构造函数规则:类至少要有一个构造函数编译器通过强制添加缺省构造函数来保证类至少要有一个构造函数缺省构造函数的特点无参调用基类的无参构造函数使用缺省构造函数的条件没有为类编写构造函数基类中存在无参的构造函数构造函数的重载课堂上,同学们在讨论正在发的新书,有些人想知道该书的id号,例外一些人想知道该书的id号和作者,不过大部分人还是想了解更多,包括该书的id好,书名,作者和价格。而构造函数的重载的原理与此一样,利用参数的不同,达到程序的多态性。生活例子:构造函数的重载
classBook
{
privatestringid;
privatestringname;
privatestringauthor;
privatestringprice;
publicBook()
//默认构造器
{
}
publicBook(stringid)
{
this.id=id;
}
publicBook(stringid,stringname,stringauthor,stringprice)//构造器重载
{
this.id=id;
=name;
this.author=author;
this.price=price;
}构造函数的重载
publicstringID
//只读属性
{
get{returnid;}
}
publicstringName
{
set{=value;}
get{returnname;}
}
publicstringAuthor
{
set{this.author=value;}
get{returnauthor;}
}
publicstringPrice
{
set{this.price=value;}
get{returnprice;}
}构造函数的重载多个构造函数,每个构造函数带有不同的参数析构函数是用于执行清除操作的特殊方法~<类名>()0{//析构函数的主体}语法:…~Employee(){
}…示例:析构函数
析构函数也是一种特殊的方法特殊的声明方法名:在类名前加一个~没有参数,没有返回类型,没有访问修饰符特殊的执行当实例从内存中删除时,自动调用析构函数不能直接调用析构函数特殊的用途释放与清理资源(.NET的垃圾回收器的功能及启动的机制。)4.3方法对象的行为接听响铃挂断PickUp(){….//用于传送和接收信号的代码}Ring(){….//用于显示主叫号码的代码}Hang(){….//用于结束会话的代码}声明方法语法访问修饰符(可选),默认情况下为
private[访问修饰符]返回类型<方法名>([参数列表]){//方法主体}如果不需要返回任何值,方法可能返回void数据类型如果需要返回值,则使用return语句声明方法…..classPoint{ intx; inty;intz; voidAssign() {
System.Console.WriteLine("输入点的值");
x=int.Parse(System.Console.ReadLine()); y=int.Parse(System.Console.ReadLine());
z=x*y;
Console.WriteLine("x:{0},y:{1},z:{2}",x,y,z);
}}…..方法Assign()
的定义
不返回任何值(void)
不接收任何值(Assign())Assign()方法方法的参数形参与实参四种类型的参数方法说明值参数形参是实参的一份拷贝形参的改变不影响实参引用型参数ref形参是实参的地址形参的改变将影响实参输出参数out与引用型参数类似但实参可以不需初始化数组型参数params参数个数可以不确定对于引用类型的值参数静态方法
publicclassA{int
x;
static
int
y;publicstaticvoidF(){//x=1;
//错误,不允许访问
y=2;
//正确,允许访问
Console.WriteLine("y={0}",y);}}实例方法classStudent{publicintstudcount=0;publicvoidSer(){studcount++;Console.WriteLine("studcount:{0}",studcount);}}静态方法静态方法的定义用static关键字方法的调用格式类名.静态方法对象名.非静态方法静态方法的限制静态方法中不能使用非静态成员静态方法与实例方法对于静态方法和非静态方法:
(1)静态方法属于类所有,非静态方法属于类定义的对象所有;(2)非静态方法可以访问类中包括静态成员在内的所有成员,而静态方法只能访问类中的静态成员。方法重载消费者
1固定电话电移动电话帐单管理层供应商
1供应商2电信电电话电对不同的数据执行相同的任务方法重载…ClassBillPayment{ … voidPayBill(inttelephoneNumber) { //此方法用于支付固定电话话费 } voidPayBill(longconsumerNumber) { //此方法用于支付电费 } voidPayBill(longconsumerNumber,doubleamount) { //此方法用于支付移动电话话费 } …}…对不同数据执行相似的功能方法重载intgreatest(intnum1,intnum2){ Console.WriteLine(“{0}和
{1}相比,最大的是:",num1,num2); if(num1>num2)
{ returnnum1;
} else
{ returnnum2;
}}intgreatest(intnum1,intnum2,intnum3){ Console.WriteLine(“{0},{1}和{2}相比,最大的是:",num1,num2,num3); if(num1>num2&&num1>num3)
{ returnnum1;
} elseif(num2>num1&&num2>num3)
{ returnnum2;
} else
{ returnnum3;
}}具有不同数量的参数的方法重载输出结果:方法重载intgreatest(int[]numbers){
inttemp=numbers[0];
for(inti=1;i<numbers.Length;i++) {
if(temp<numbers[i])
temp=numbers[i]; }
returntemp;}doublegreatest(double[]numbers){doubletemp=numbers[0];
for(inti=1;i<numbers.Length;i++) {
if(temp<numbers[i])
temp=numbers[i]; }
returntemp;}具有不同类型的参数的方法重载输出结果:方法的签名publicvoidA(intp1,intp2){}和publicvoidB(intq1,intq2){}的签名相同,而publicintC(intm1,intm2){}则和方法A签名不同,因为C的返回值为int方法重载方法重载方法名相同(前提:功能相近)参数类型或者个数不同函数返回值与方法重载如果仅是函数返回值类型不同,并不是方法重载方法的签名(MSDN)由方法的名称和它的形参表组成。形参按从左到右的顺序比较类型、种类和个数。usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;namespaceConsoleApplication3{classProgram{staticvoidMain(string[]args){Vehicle[]v=newVehicle[3];v[0]=newVehicle();v[1]=newCar();v[2]=newPlane();foreach(Vehicleveinv){Console.WriteLine(ve.Start());}Console.ReadKey();}}classVehicle{publicvirtualstringStart(){return"交通工具启动";}}classCar:Vehicle{publicoverridestringStart(){return"汽车起步";}}classPlane:Vehicle{publicoverridestringStart(){return"飞机起飞";}}}输出结果:方法的覆盖方法重写对基类同名方法,用关键字virtual修饰,即虚方法对派生类同名方法,用关键字override修饰4.4属性字段访问级别设为public存在的问题C#用属性来解决此问题不直接操作类的字段,而是借助访问器get与set进行读写访问器中可以根据程序逻辑在读、写字段时进行适当的检查充分体现了面向对象的封装性属性例读取
Name时调用将值赋给Name时调用
属性的声明只读、只写属性
[访问修饰符]数据类型属性名
{ get{}; set{};}get访问器用return与属性类型一致的值set访问器与属性类型相同的隐式参数value命名空间
英国澳大利亚纽卡斯尔纽卡斯尔命名空间ClassManager{longintsalary;………………}…….…….{longintsalary;…….………}ClassManager命名空间AdminDept命名空间ITDeptAdminDept.ManagerITDept.Manager类库命名空间Class
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年浙江杭州市时代小学招聘校医1人考前自测高频考点模拟试题及完整答案详解1套
- 初一家长会家长代表发言稿范文
- 2025内蒙古巴彦淖尔市临河区第三人民医院招聘部分人员3人模拟试卷完整参考答案详解
- 2025广东省事业单位招聘高层次和急需紧缺人才237人考前自测高频考点模拟试题完整参考答案详解
- 2025年山东省环保发展集团有限公司校园招聘(144人左右)模拟试卷及答案详解(夺冠)
- 2025江苏南通大学招聘105人考前自测高频考点模拟试题及一套完整答案详解
- 2025年河北唐山滦州市森林草原消防专业队员招聘7人考前自测高频考点模拟试题及一套完整答案详解
- 2025年宁波北仑区人民医院医疗健康服务集团梅山院区招聘编外人员2人考前自测高频考点模拟试题及一套完整答案详解
- 2025年湖南长沙市望城区招聘教师183人考前自测高频考点模拟试题及完整答案详解1套
- 2025安徽安庆职业技术学院高层次人才引进7人模拟试卷附答案详解(完整版)
- 2025年大学生国防科技知识竞赛题库及答案
- 声带息肉术后发声训练
- 幼儿园大班数学活动《五以内的加减法》课件
- 乡镇视频监控系统维护操作手册
- 教育机构投资协议合同书
- 《大学生就业指导》课件第六章 就业权益与法律保障
- 新版部编人教版二年级上册语文全册1-8单元教材分析
- 石墨化工艺基础知识培训
- 如何落实高质量临床护理服务
- 2025年四川政治理论水平试题及答案
- 2025考研政治真题试卷与参考答案
评论
0/150
提交评论