面向对象3.ppt_第1页
面向对象3.ppt_第2页
面向对象3.ppt_第3页
面向对象3.ppt_第4页
面向对象3.ppt_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

1、第五章,C# 中的继承,2,回顾,类是 C# 中的一种结构,用于在程序中模拟现实生活的对象 成员变量表示对象的特征 方法表示对象可执行的操作 如果类中未定义构造函数,则由运行库提供默认构造函数,3,析构函数不能重载,并且每个类只能有一个析构函数 可以根据不同数量的参数或不同数据类型参数对方法进行重载,不能根据返回值进行方法重载 命名空间用来界定类所属的范围,类似于Java中的包,4,目标,理解继承 在C# 中使用继承 在C#中使用接口 在C#中使用方法的重写,5,类的继承是面向对象语言的基本特性,在数据封装和代码复用方面有着无可替代的重要作用 在继承过程中,派生类可以对基类进行扩充 在继承过程

2、中,派生类可以对基类进行改造,6,类的继承语法, class : ,7,继承 2-1,Class Base / 成员变量 int basevar; / 成员函数 public void Base_fun1() / 定义 . .,Class Derived : Base / 成员变量 int derivedvars; / 成员函数 public void Derived_fun1() / 定义 . .,基类,void main() Derived dr_obj = new Derived() ; dr_obj.Base_fun1(); ,无需重新编写代码,派生类,8,狗,马,继承 2-2,动物,

3、基类,派生类,继承的层次结构示例,Class Animal / 成员变量 int eyes, nose; public Animal() eyes = 2; nose = 1; public void Pet_Animal() / 定义 ,基类,Class Dog : Animal / 成员变量 / 成员函数 private void Barking() / 定义 private void Wagging_Tail() ,派生类,9,继承 C# 中的类,public class Graduate: Student, Employee / 成员变量 / 成员函数 ,不允许多重继承,允许多重接口实

4、现,10,演示,public class Person private string _name; private uint _age; public void GetInfo() Console.WriteLine(请输入您的姓名和年龄); _name = Console.ReadLine(); _age = uint.Parse(Console.ReadLine(); public void DispInfo() Console.WriteLine(尊敬的 0,您的年龄为 1, _name, _age); ,基类,11,演示,public class Student:Person priv

5、ate string _school; private uint _eng; private uint _math; private uint _sci; public void GetMarks() Console.WriteLine(“请输入学校名称); _school = Console.ReadLine(); Console.WriteLine(请分别输入英语、数学和自然科学的分数。); _eng = uint.Parse(Console.ReadLine(); _math = uint.Parse(Console.ReadLine(); _sci = uint.Parse(Conso

6、le.ReadLine(); Console.WriteLine(“所得总分为:0,_eng+_math+_sci); ,派生类,12,演示,public class Person private string _name; private uint _age; public void GetInfo() Console.WriteLine(请输入您的姓名和年龄); _name = Console.ReadLine(); _age = uint.Parse(Console.ReadLine(); public void DispInfo() Console.WriteLine(尊敬的 0,您的

7、年龄为 1 , _name, _age); ,static void Main(string args) Student objStudent = new Student(); objStudent.GetInfo(); objStudent.DispInfo(); objStudent.GetMarks(); ,调用的基类成员,13,用于从派生类中访问基类成员 可以使用 base 关键字调用基类的构造函数 base关键字的语法格式: base.域名 bast.方法名(参数列表),关键字 base,14,调用 base 构造函数,public class Student:Person priv

8、ate uint id; /调用 Person 构造函数 public Student(string name,uint age,uint id):base(name,age) this.id = id; Console.WriteLine(id); ,:base 关键字将调用 Person 类构造函数,15,演示,public class Person public string _name; public uint _age; public Person(string name, uint age) this._name = name; this._age = age; Console.W

9、riteLine(_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(_id); ,还将调用 Base 构造函数,16,static void Main(string args) /构造 Student Student objStudent = new Student(XYZ, 45, 001);

10、,17,/将执行派生类的变量,/要求 new 访问修饰符,将输出派生类中的 val,相同字段,new,隐藏继承成员,关键字 new,18,多态性,现实世界的每一类事物可能呈现出千资百态的具体形态 在C#中,声明成基类类型的引用变量,最终可以引用其不同的子类的对象 一个对象定义成基类的数据类型,但对象引用可以指向其任何一个派生类型的对象,19,多态实现机制,将基类中的函数定义成虚函数,在派生类中覆盖该虚函数. 在基类中: virtual name() statements ,20,在派生类中: override name() statements ,21,关键字 virtual / 成员函数 p

11、ublic virtual void GetInfo() / 定义 . .,Class Derived : Base / 成员变量 int derivedvars; / 成员函数 public override void GetInfo() / 定义 . .,基类,派生类,base 方法的新实现,22,class Employee public virtual void EmpInfo() Console.WriteLine(“此方法显示职员信息); ,class DervEmployee: Employee public override void EmpInfo() base.EmpInf

12、o(); Console.WriteLine(“此方法重写 base 方法); ,23,static void Main(string args) DervEmployee objDervEmployee = new DervEmployee(); objDervEmployee.EmpInfo(); Employee objEmployee = objDervEmployee; objEmployee.EmpInfo(); ,24,抽象类,为了简化代码和提高效率,可以将类中结构和功能相近的部分组成一个基类.通过继承机制得到需要的多个派生类. 将功能相近的部分定义成抽象类.抽象类的成员在每一个

13、派生类都必须被继承. 抽象方法在派生类中需要进行覆盖.,25,抽象类和抽象方法 2-1,abstract class ClassOne /类实现 ,访问修饰符,派生类的基类,不能实例化,26,抽象方法定义,Abstract methodName(paralist) 用abstract 关键字来修饰的类叫做抽象类,含有抽象方法的类必须被声明为抽象类 抽象类不能被实例化,抽象类只能在继承中发挥作用,抽象方法只能在被覆盖后由派生类的对象调用,27,abstract class Base / 成员变量 int basevar; / 成员函数 abstract void base_fun1(parame

14、ters); / 无法实现 . ,抽象方法,class Derived : Base / 成员变量 int derivedvars; / 成员函数 override void Base_fun1(parameters) / 实际实现 . ,抽象类,派生类,提供,重写方法,原型,必须重写,抽象类和抽象方法 2-2,28,演示,using System; namespace Example_5 abstract class ABC public abstract void AFunc(); public void BFunc() Console.WriteLine(“这是一个非抽象方法!); cl

15、ass Derv : ABC public override void AFunc() Console.WriteLine(“这是一个抽象方法! ); ,抽象类 不能实例化,派生类 重写方法,static void Main(string args) Derv objB = new Derv(); objB.AFunc(); objB.BFunc(); ,29,abstract class MyAbs public abstract void AbMethod(); /派生类 class MyClass : MyAbs public override void AbMethod() Conso

16、le.WriteLine(“在 MyClass 中实现的抽象方法); /派生自 MyClass 的子类 class SubMyClass:MyClass public void General() /未实现 AbMethod 抽象方法 Console.WriteLine(在 SubMyClass 中未实现的抽象方法 ); ,static void Main(string args) SubMyClass objSubClass = new SubMyClass(); objSubClass.General(); ,30,抽象类的性质,在派生类中如果没有实现抽象类中的全部抽象方法,则派生类也必须

17、声明为抽象类 不含抽象方法的类也可以声明为抽象类 抽象类和派生类间仍然适用多态性机制.,31,接口 4-1,OFF,ON,请按开关按钮:ON/OFF,两种方法 ON OFF,32,接口 4-2,ISwitch ON() OFF(),33,接口的特性,定义接口时不应包含构造函数及静态成员 在继承时必须覆盖原接口中的全部抽象方法 通过接口可能实现不相关类的相同行为,而不需要考虑这些类之间的层次关系.,34,接口 4-3,class IBase void method1(); int method2(); int method3(float); /没有实现 . ,接口,interface,只有方法声

18、明,没有实现,35,public interface IPict int DeleteImage(); void DisplayImage(); ,隐式声明为 public,无访问修饰符,示例中的 IPict 接口用于演示接口,接口 4-4,36,演示,public class MyImages : IPict /第一个方法的实现 public int DeleteImage() Console.WriteLine(“DeleteImage 实现!); return(5); /第二个方法的实现 public void DisplayImage() Console.WriteLine(Displ

19、ayImage 实现!); ,static void Main(string args) MyImages objM = new MyImages(); objM.DisplayImage(); int t = objM.DeleteImage(); Console.WriteLine(t); ,派生自 IPict 接口,37,演示:示例 10,public interface IPict int DeleteImage(); void DisplayImage(); public class MyImages : BaseIO, IPict public int DeleteImage()

20、Console.WriteLine(“DeleteImage 实现!); return(5); public void DisplayImage() Console.WriteLine(“DisplayImage 实现!); ,public class BaseIO public void Open() Console.WriteLine(BaseIO 的 Open 方法); ,static void Main(string args) MyImages objM = new MyImages(); objM.DisplayImage(); int val = objM.DeleteImage

21、(); Console.WriteLine(val); objM.Open(); ,可继承类和接口,38,多重接口实现,C# 不允许多重类继承 但 C# 允许多重接口实现 这意味着一个类可以实现多个接口,39,演示:示例 11,public interface IPictManip void ApplyAlpha(); /第二个接口 public interface IPict int DeleteImage(); void DisplayImage(); public class BaseIO public void Open() Console.WriteLine(“BaseIO 的 Op

22、en 方法); ,static void Main(string args) MyImages objM = new MyImages(); objM.DisplayImage(); objM.DeleteImage(); objM.Open(); objM.ApplyAlpha(); ,40,显式接口实现,在 C# 中,只要不发生命名冲突,就完全可以允许多重接口实现,public interface IPictManip void ApplyAlpha(); ,public interface IPict void ApplyAlpha(); ,public class MyImages :

23、 BaseIO, IPict, IPictManip public int ApplyAlpha() . . ,?,使用显式接口实现,41,演示:示例 12,public class MyImages : BaseIO, IPict, IPictManip public int DeleteImage() Console.WriteLine(“DeleteImage 实现!); return(5); public void ApplyAlpha() Console.WriteLine(“ApplyAlpha 实现!); void IPict.DisplayImage() Console.Wri

24、teLine(“DisplayImage 的 IPict 实现); void IPictManip.DisplayImage() Console.WriteLine(“DisplayImage 的 IPictManip 实现); ,显式接口实现,static void Main(string args) MyImages objM = new MyImages(); IPict Pict = objM; /IPict 引用 Pict.DisplayImage(); IPictManip PictManip = objM; /IPictManip 引用 PictManip.DisplayImage(); ,42,演示:示例 13,public interface IPict int DeleteImage(); public interface IPictManip void

温馨提示

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

评论

0/150

提交评论