




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C#面向对象编程(二)继承、封装和多态,9 继承、封装和多态,9.1 封装 9.2 继承 9.3 多态 9.4 this和base关键字 9.5 接口,9.1封装对象的原理,什么是封装 (encapsulation),封装的好处 良好的封装能够减少耦合 类内部的实现可以自由地修改 类具有清晰的对外接口,类的封装改变了用户传统的使用数据和代码的方式. 它将方法和数据包含在一起构成一个独立的单元,可以通过设定单元内各个 成员的的特性来控制对成员的访问。 比如将一个字段定义为private,就可以防止外界直接访问这个字段。,数据隐藏,封装性最有用的方式之一 实现方法访问限制修饰符 public 无限
2、制,允许任何人来访问 protected internal = protected + internal Internal 允许项目或程序内部的类来访问 protected 继承时子类可以对基类有完全访问权 private 只允许同一个类中的成员访问 属性也用来封装类的细节,并提供公用接口给该类的用户,public class Student private string studentname; public string getstudentname( ) return(studentname); public string setstudentname(string na) studen
3、tname=na; ,class App public static void Main( ) Student s1=new Student( ); s1.setstudentname(“zhanghua”); Console.WriteLine(s1.getstudentname( ); ,不能使用语句 s1.studentname=“zhanghua”;,继承性(inheritance),一个类可以有能力直接从另一个类获得其代码和数据 派生类从基类那里获得其所有的成员 例: GUI设计的Form look and feel都是从.NET Form class继承下来的,System.Win
4、dows.Forms.Form,继承透视图,如果Class Child是继承Class Parent而来 Child的对象中包含一个Parent的对象,Child,Parent,public class Parent public int X; . . . ,public class Child : Parent public int Y; . . . ,/ client. Child obj; obj = new Child(); obj.X = 10; obj.Y = 20;,X:,Y:,publicmethods,如何访问基类成员?,派生类可以调用基类的方法 通过使用base关键字 派生
5、类在访问基类的时候有一定的限制,不能访问 private 的成员;internal的基类成员只能被同一个程序集中的派生类访问,public class Account public double balance; public bool Withdraw(double amt) balance -= amt; return true; ,public class CheckAccount:Account public bool Withdraw(double amt) if(amt= base.balance) return base.Withdraw(amt); else return fa
6、lse; ,继承 2-1,Class Base / 成员变量 int basevar; / 成员函数 Base_fun1() / 定义 . .,Class Derived : Base / 成员变量 int derivedvars; / 成员函数 Derived_fun1() / 定义 . .,基类,void main() Derived dr_obj = new Derived() ; dr_obj.Base_fun1(); ,无需重新编写代码,派生类,狗,马,继承 2-2,动物,基类,派生类,继承的层次结构示例,Class Animal / 成员变量 int eyes, nose; Ani
7、mal() eyes = 2; nose = 1; void Pet_Animal() / 定义 ,基类,Class Dog : Animal / 成员变量 / 成员函数 private Barking() / 定义 private Wagging_Tail() ,派生类,继承 C# 中的类,public class Graduate: Student, Employee / 成员变量 / 成员函数 ,多重继承,允许多重接口实现,C#只允许单一继承,演示,public class Person private string _name; private uint _age; public vo
8、id GetInfo() Console.WriteLine(请输入您的姓名和年龄); _name = Console.ReadLine(); _age = uint.Parse(Console.ReadLine(); public void DislayInfo() Console.WriteLine(尊敬的 0,您的年龄为 1, _name, _age); ,public class Student:Person private string _schoolname; private uint _engscore; private uint _mathscore; private uint
9、 _sciscore; private uint _totscore; public uint GetMarks() Console.WriteLine(“请输入学校名称); _schoolname = Console.ReadLine(); Console.WriteLine(请输入英语、数学和自然科学的分数。 ); _engscore = uint.Parse(Console.ReadLine(); _mathscore = uint.Parse(Console.ReadLine(); _sciscore = uint.Parse(Console.ReadLine(); _totscore
10、 = _engscore + _mathscore + _sciscore; Console.WriteLine(所得总分为:0 ,_totscore); return _totscore; ,基类,派生类,public class UnderGraduate:Student public void Check() Console.WriteLine(要上升一级,要求总分不低于 150 ); if(this.GetMarks() =150) Console.WriteLine(“pass); else Console.WriteLine(“not pass); ,派生类,public stat
11、ic void Main(string args) UnderGraduate objUnderGraduate = new UnderGraduate(); objUnderGraduate.GetInfo(); objUnderGraduate.DisplayInfo(); objUnderGraduate.Check(); ,base 用于从派生类中访问基类成员 可以使用 base 关键字调用基类的构造函数 this 用于调用本类的数据成员或方法 也可以不写,关键字 base和this,构造函数,构造函数不能继承 在实例化子类对象时,会默认调用父类构造函数 如果父类有多个构造函数,子类会
12、默认调用无参的构造函数 如果需要调用有参的默认函数,需要显示指明,需要使用base关键字,15,调用 base 构造函数,public class Student:Person private uint id; /调用 Person 构造函数 public Student(string name,uint age,uint id):base(name,age) this.id = id; Console.WriteLine(id); ,:base 关键字将调用 Person 类构造函数,基类的构造函数先执行再执行派生类的构造函数。,16,演示,public class Person publi
13、c string _name; public uint _age; public Person(string name, uint age) this._name = name; this._age = age; Console.WriteLine(_name); Console.WriteLine(_age); ,public class Student:Person private uint _id; public Student(string name, uint age, uint id):base(name, age) this._id = id; Console.WriteLine
14、(_id); ,还将调用 Base 构造函数,static void Main(string args) /构造 Student Student objStudent = new Student(XYZ, 45, 001); ,演示,示例代码,类的多态性(1),今天你多态了吗? 面向对象程序设计中的重要概念多态性。 在运行时,可以通过指向基类的引用,来调用实现派生类中的方法。 同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。 多态性通过派生类覆写基类中的虚函数型方法来实现。,类的多态性(2),编译时的多态性 编译时的多态性是通过重载来实现的。对于非虚的成员来说,系
15、统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。 运行时的多态性 运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。 C#中,运行时的多态性通过覆写虚成员实现。,类的多态性的实现,(1)类内部或子类和和父类定义同名但参数列表不同的方法,称为方法的重载(overload); (2)子类和和父类定义同名且参数列表也相同的方法,称为新增,这时应 该在子类的同名方法前面用new修饰符; (3)子类和和父类定义同名且参数列表也相同的方法,并且父类中的方法用abstract/virtual进行修饰,子类中的方法用override进行了修饰,称为虚方法的覆盖(override
16、)。,编译时多态 _重载(Overload),重载_类中定义的方法可能有不同的版本 public bool Withdraw(double amt, string name) public double Withdraw(double amt) 特点(两必须一可以) 方法名必须相同 参数列表必须不相同 返回值类型可以不相同,一般用于同一个类中,最常用于类的构造函数,相同方法,new,隐藏继承成员,关键字 new,演示,示例代码,运行时多态_方法的覆盖(override),父类中的方法用abstract/virtual进行修饰,子类中的方法用override进行了修饰,称为虚方法的覆盖(over
17、ride)。,运行时多态(1) _虚函数,一般用于继承类关系中,1、声明虚方法(在基类中) 使用virtual关键字 public virtual bool Withdraw(); 2、调用虚方法,运行时将确定调用对象是什么类的实例,并调用适当的覆写的方法。 3、虚方法可以有实现体,覆写(Override),子类中为满足自己的需要来重复定义某个方法的不同实现覆写 通过使用关键字override来覆写 public override bool Withdraw() 只有虚方法和抽象方法才能被覆写 要求: (三相同) 相同的方法名称 相同的参数列表 相同的返回值类型,关键字 override和vi
18、rtual,public class Person public virtual void WriteInfo() Console.WriteLine(我是人的方法); ,public class Student:Person public override void WriteInfo() Console.WriteLine(我是学生的方法); ,基类,派生类,base 方法的新实现,class Student public virtual void StuInfo() Console.WriteLine(“此方法显示学生信息); ,class ExpStudent: Student pub
19、lic override void StuInfo() base.StuInfo(); Console.WriteLine(“此方法重写 base 方法); ,static void Main(string args) ExpStudent objStudent = new ExpStudent(); objStudent.StuInfo(); Student objSuper = objStudent; objSuper.StuInfo(); ,演示,示例代码,抽象类和抽象方法 2-1,abstract class ClassOne /类实现 ,访问修饰符,派生类的基类,不能实例化,运行时多
20、态(2) _抽象函数,abstract class Base / 成员变量 int basevar; / 成员函数 abstract void base_fun1(parameters); / 无法实现 . ,抽象方法,class Derived : Base / 成员变量 int derivedvars; / 成员函数 override void Base_fun1(parameters) / 实际实现 . ,抽象类,派生类,提供,重写方法,原型,必须重写,抽象类和抽象方法 2-2,32,演示,using System; namespace Example_1 abstract class
21、ABC public abstract void AFunc(); public void BFunc() Console.WriteLine(“这是一个非抽象方法!); class Derv : ABC public override void AFunc() Console.WriteLine(“这是一个抽象方法! ); ,抽象类 不能实例化,派生类 重写方法,static void Main(string args) Derv objB = new Derv(); objB.AFunc(); objB.BFunc(); ,33,abstract class MyAbs public ab
22、stract void AbMethod(); /派生类 class MyClass : MyAbs public override void AbMethod() Console.WriteLine(“在 MyClass 中实现的抽象方法); /派生自 MyClass 的子类 class SubMyClass:MyClass public void General() /未实现 AbMethod 抽象方法 Console.WriteLine(在 SubMyClass 中未实现的抽象方法 ); ,static void Main(string args) SubMyClass objSubCl
23、ass = new SubMyClass(); objSubClass.General(); ,密封类,不能从密封类派生 防止类在子类中被重载,或被第三方扩展,public sealed class MyClass / class members ,演示,示例代码,接口 3-2,class IBase void method1(); int method2(); /没有实现 . ,接口,interface,只有方法声明,没有实现,public interface IPicture int DelImage(); void ShowImage(); ,隐式声明为 public,无访问修饰符,示例
24、中的 IPicture接口用于演示接口,接口 3-3,演示,public class MyPicture : IPicture /第一个方法的实现 public int DelImage() Console.WriteLine(“DelImage 实现!); return(1); /第二个方法的实现 public void ShowImage() Console.WriteLine(“ShowImage 实现!); ,static void Main(string args) MyPicture objM = new MyPicture(); objM.ShowImage(); int t = objM.DelImage(); Console.WriteLine(t); ,派生自 IPicture 接口,演示,public interface IPicture int DelImage(); void ShowImage(); public class MyPicture : BaseIO, IPictu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年海南高中学业水平合格性考试化学试卷真题(含答案详解)
- 健康生活-快乐生活课件
- 2024年水利管理及技术咨询服务项目投资申请报告代可行性研究报告
- 虎丘区工程监理管理办法
- 融媒体团队管理办法细则
- 衡水市药品安全管理办法
- 行业税收网格化管理办法
- 装修贷资金管理暂行办法
- 西安疫情中风险管理办法
- 规范新闻记者证管理办法
- 水利工程施工监理规范(SL288-2014)用表填表说明及示例
- 医疗责任组长竞聘
- 投标货物包装、运输方案
- 抽水蓄能电站地下厂房系统开挖工程施工方案
- 国家开放大学《建筑力学》形成性作业1-4参考答案
- 流浪未成年人救助保护中心建设标准
- 2025数学步步高大一轮复习讲义人教A版复习讲义含答案
- 高中英语单词构词法(完整版)
- PLM模块业务流程图
- 专题02《物态变化》压轴培优题型训练【十三大题型】(原卷版)
- 大学生科研训练与论文写作全套教学课件
评论
0/150
提交评论