第3章面向对象技术_第1页
第3章面向对象技术_第2页
第3章面向对象技术_第3页
第3章面向对象技术_第4页
第3章面向对象技术_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、第5讲 继 承5.1 C#的继承机制5.1.1 概述几个概念:基类,父类,派生类,子类,单继承,多继承。1、 简单继承例:using System;class Vehicle /定义汽车类int wheels; /公有成员 轮子个数protected float weight; /保护成员 重量public Vehicle();public Vehicle (int w,float g)wheels = w;weight = g;public void Speak()Console.WriteLine(“the w vehicle is speaking!”);class Car :Vehic

2、le /定义轿车类 从汽车类中继承int wheels; /公有成员 轮子个数protected float weight;int passengers; /私有成员 乘客数public Car(int w,float g,int p) : base(w,g)wheels = w;weight = g;passengers = p;public void Speak()Console.WriteLine(“the w vehicle is speaking!”);C#中的继承符合下列规则:l 继承是可传递的 如果 C 从 B 中派生, B 又从 A 中派生。 那么 C 不仅继承了B 中声明的成

3、员, 同样也继承了 A 中的成员, Object 类作为所有类的基类。l 派生类应当是对基类的扩展 派生类可以添加新的成员 ,但不能除去已经继承的成员的定义。l 构造函数和析构函数不能被继承 除此以外的其它成员, 不论对它们定义了怎样的访问方式, 都能被继承。 基类中成员的访问方式只能决定派生类能否访问它们。l 派生类如果定义了与继承而来的成员同名的新成员, 就可以覆盖已继承的成员。 但这并不因为这派生类删除了这些成员 ,只是不能再访问这些成员。l 类可以定义虚方法 虚属性以及虚索引指示器 它的派生类能够重载这些成员, 从而实现类可以展示出多态性。再看一个例子:using System;usi

4、ng System.Text;class Person private string firstName; private string middleName; private string lastName; private int age; public Person() public Person(string fn, string ln) firstName = fn; lastName = ln; public Person(string fn, string mn, string ln) firstName = fn; middleName = mn; lastName = ln;

5、 public Person(string fn, string mn, string ln, int a) firstName = fn; middleName = mn; lastName = ln; age = a; public void displayAge() Console.WriteLine(Age 0, age); public void displayFullName() StringBuilder FullName = new StringBuilder(); FullName.Append(firstName); FullName.Append( ); if( midd

6、leName != ) FullName.Append(middleName0); FullName.Append(. ); FullName.Append(lastName); Console.WriteLine(FullName); class NameApp public static void Main() Person me = new Person(Bradley, Lee, Jones); Person myWife = new Person(Melissa, Anne, Jones, 21); me.displayFullName(); me.displayAge(); myW

7、ife.displayFullName(); myWife.displayAge(); 结果:Bradly L.JonesAge 0Melissa A.JonesAge 21 继承using System;using System.Text;class Person protected string firstName; protected string middleName; /不能访问基类中的私有成员 protected string lastName; private int age; /ToDo: Add properties to access data members public

8、 Person() public Person(string fn, string ln) firstName = fn; lastName = ln; public Person(string fn, string mn, string ln) firstName = fn; middleName = mn; lastName = ln; public Person(string fn, string mn, string ln, int a) firstName = fn; middleName = mn; lastName = ln; age = a; public void displ

9、ayAge() Console.WriteLine(Age 0, age); public void displayFullName() StringBuilder FullName = new StringBuilder(); FullName.Append(firstName); FullName.Append( ); if( middleName != ) FullName.Append(middleName0); FullName.Append(. ); FullName.Append(lastName); Console.WriteLine(FullName); class Empl

10、oyee : Person private ushort hYear; public ushort hireYear get return(hYear); set hYear = value; public Employee() : base() /调用积累中的构造方法 public Employee( string fn, string ln ) : base( fn, ln) public Employee(string fn, string mn, string ln, int a) : base(fn, mn, ln, a) public Employee(string fn, str

11、ing ln, ushort hy) : base(fn, ln) hireYear = hy; public new void displayFullName() /这里是覆盖 Console.WriteLine(Employee: 0 1 2, firstName, middleName, lastName); class NameApp public static void Main() Person myWife = new Person(Melissa, Anne, Jones, 21); Employee me = new Employee(Bradley, L., Jones,

12、23); Employee you = new Employee(Kyle, Rinni, 2000); myWife.displayFullName(); myWife.displayAge(); me.displayFullName(); Console.WriteLine(Year hired: 0, me.hireYear); me.displayAge(); you.displayFullName(); Console.WriteLine(Year hired of him: 0, you.hireYear); you.displayAge(); 2、 使用基类的方法 Public

13、new void dsply()Base.displayFullName(); 实验一 自己定义一个基类,派生一个子类,在子类中调用基类的成员方法;5.2 多 态 性在面向对象的系统中, 多态性是一个非常重要的概念, 它允许客户对一个对象进行操作。 由对象来完成一系列的动作, 具体实现哪个动作 ,如何实现由系统负责解释 。 5.2.1 C#中的多态性 在 C#中 多态性的定义是: 同一操作作用于不同的类的实例 ,不同的类将进行不同的解释, 最后产生不同的执行结果。C#支持两种类型的多态性 :编译时的多态性-编译时的多态性是通过重载来实现的 。运行时的多态性-运行时的多态性就是指直到系统运行时,

14、 才根据实际情况决定实现何种操作 ,C#中, 运行时的多态性通过虚成员实现 。例:using System;class Person protected string firstName; protected string lastName; public Person() public Person(string fn, string ln) firstName = fn; lastName = ln; public void displayFullName() Console.WriteLine(0 1, firstName, lastName); class Employee : Per

15、son public ushort hireYear; public Employee() : base() public Employee( string fn, string ln ) : base( fn, ln) public Employee(string fn, string ln, ushort hy) : base(fn, ln) hireYear = hy; public new void displayFullName() Console.WriteLine(Employee: 0 1, firstName, lastName); class NameApp public

16、static void Main() Employee me = new Employee(Bradley, Jones, 1983); Person Brad = me; me.displayFullName(); Console.WriteLine(Year hired: 0, me.hireYear); Brad.displayFullName(); 调用积累的方法实现 /调用各自所属类的方法实验二 测试 Brad.displayFullName();是否调用了积累的方法 5.2.2 虚方法 当类中的方法声明前加上了 virtual 修饰符 ,我们称之为虚方法, 反之为非虚。 使用了 v

17、irtual 修饰符后 不允许再有 static, abstract, 或 override 修饰符 。对于非虚的方法, 无论被其所在类的实例调用,还是被这个类的派生类的实例调用。 方法的执行方式不变 ,而对于虚方法, 它的执行方式可以被派生类改变,这种改变是通过方法的重载来实现的。using System;class Apublic void F() Console.WriteLine(A.F); public virtual void G() Console.WriteLine(A.G); class B: Anew public void F() Console.WriteLine(B.

18、F); public override void G() Console.WriteLine(B.G); class Teststatic void Main() B b = new B();A a = b;a.F();b.F();a.G();b.G(); /测试例子中 A 类提供了两个方法, 非虚的 F 和虚方法 G 。类 B 则提供了一个新的非虚的方法 F 从而覆盖了继承的 F, 类 B 同时还重载了继承的方法 G 那么输出应该是A.FB.FB.GB.G实验三 试写出程序的运行结果using System;class Person protected string firstName; p

19、rotected string lastName; public Person() public Person(string fn, string ln) firstName = fn; lastName = ln; public virtual void displayFullName() Console.WriteLine(0 1, firstName, lastName); class Employee : Person public ushort hireYear; public Employee() : base() public Employee(string fn, string

20、 ln, ushort hy) : base(fn, ln) hireYear = hy; public override void displayFullName() Console.WriteLine(Employee: 0 1, firstName, lastName); / A new class derived from Person.class Contractor : Person public string company; public Contractor() : base() public Contractor(string fn, string ln, string c

21、) : base(fn, ln) company = c; public override void displayFullName() Console.WriteLine(Contractor: 0 1, firstName, lastName); class NameApp public static void Main() Person Brad = new Person(Bradley, Jones); Person me = new Employee(Bradley, Jones, 1983); Person Greg = new Contractor(Hill, Batfield,

22、 Data Diggers); Brad.displayFullName(); me.displayFullName(); Greg.displayFullName(); 5.2.3 在派生类中对虚方法进行重载重载对基类虚方法的重载是函数重载的另一种特殊形式, 在派生类中重新定义此虚函数时 要求的是方法名称, 返回值类型, 参数表中的参数个数、 类型 、顺序都必须与基类中的虚函数完全一致, 在派生类中声明对虚方法的重载, 要求在声明中加上override 关键字 而且不能有 new, static 或 virtual 修饰符。using System;class Vehicle/定义汽车类Pu

23、blic int wheels; /公有成员 轮子个数protected float weight; /保护成员 重量public Vehicle(int w,float g)wheels = w;weight = g;public virtual void Speak()Console.WriteLine(“the w vehicle is speaking!”);class Car:Vehicle /定义轿车类int passengers; /私有成员 乘客数public Car(int w,float g,int p) : base(w,g)wheels = w;weight = g;p

24、assengers = p;public override void Speak()Console.WriteLine(“The car is speaking:Di-di!”);class Truck:Vehicle /定义卡车类int passengers; /私有成员 乘客数loat load; /私有成员 载重量public Truck (int w,float g,int p float l) : base(w,g)wheels = w;weight = g;passengers = p;Console.WriteLine(“The truck is speaking:Ba-ba!”

25、);class Testpublic static void Main()Vehicle v1 = new Vehicle();Car c1 = new Car(4,2,5);Truck t1 = new Truck(6,5,3,10);v1.Speak();v1 = c1;v1.Speak();c1.Speak();v1 = t1;v1.Speak();t1.Speak(); The Vehicle is speaking!The car is speaking:Di-di!The car is speaking:Di-di!The truck is speaking:Ba-ba!The t

26、ruck is speaking:Ba-ba!5.3 抽象与密封5.3.1 抽象类抽象类使用 abstract 修饰符 对抽象类的使用有以下几点规定:抽象类只能作为其它类的基类, 它不能直接被实例化, 而且对抽象类不能使用new 操作符, 抽象类如果含有抽象的变量或值, 则它们要么是 null 类型 ,要么包含了对非抽象类的实例的引用。抽象类允许包含抽象成员。抽象类不能同时又是密封的。如果一个非抽象类从抽象类中派生, 则其必须通过重载来实现所有继承而来的抽象成员。abstract class Apublic abstract void F();abstract class B: Apublic

27、 abstract void F();public void G() class C: Bpublic override void F() / F 的具体实现代码实例using System;abstract class Vehicle /定义汽车类Public int wheels; /公有成员 轮子个数protected float weight; /保护成员 重量public Vehicle(int w,float g)wheels = w;weight = g;public virtual void Speak()Console.WriteLine(“the w vehicle is

28、speaking!”);class Car:Vehicle /定义轿车类int passengers;/私有成员 乘客数public Car(int w,float g,int p) : base(w,g)wheels = w;weight = g;passengers = p;public override void Speak()Console.WriteLine(“The car is speaking:Di-di!”);class Truck:Vehicle /定义卡车类int passengers; /私有成员 乘客数float load; /私有成员 载重量public Truck

29、 (int w,float g,int p float l) : base(w,g)wheels = w;weight = g;ssengers = p;load = l;public override void Speak()Console.WriteLine(“The truck is speaking:Ba-ba!”);?抽象方法可否覆盖,请创建基类和子类验证之。作业5.3.2 抽象方法一个方法声明中如果加上 abstract 修饰符 ,我们称该方法为抽象方法 abstract method如果一个方法被声明也是抽象的, 那么该方法默认也是一个虚方法, 事实上 抽象方法是一个新的虚方法。

30、 它不提供具体的方法实现代码 ,我们知道 非虚的派生类要求通过重载为继承的虚方法提供自己的实现 ,而抽象方法则不包含具体的实现内容所以方法声明的执行体中只有一个分号。只能在抽象类中声明抽象方法 ,对抽象方法 不能再使用 static 或 virtual 修饰符。而且方法不能有任何可执行代码 ,哪怕只是一对大括号中间加一个分号 ;都不允许出现 只需要给出方法的原型就可以了。using System;abstract class Vehicle /定义汽车类Public int wheels; /公有成员 轮子个数protected float weight; /保护成员 重量public Vehicle(int w,float g)wheels = w;weight = g;public abstract void Speak(); class Car:Vehicle /定义轿车类int passengers; /私有成员 乘客数public Car(int w,float g,int p) : base(w,g)wheels = w;weight = g;passengers = p;public override void Speak()Console.WriteLine(“The car is speaking:Di-di

温馨提示

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

评论

0/150

提交评论