《第六章 C#面向对象编程教程.ppt》由会员分享,可在线阅读,更多相关《第六章 C#面向对象编程教程.ppt(34页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第六章第六章 C#面向对象面向对象主要内容主要内容1.面向对象及面向对象中的类面向对象及面向对象中的类2.类的字段和属性类的字段和属性3.类的方法类的方法4.类的构造函数类的构造函数5.类的三大特征:类的三大特征:封装、继承、多态封装、继承、多态6.接口接口7.异常异常public class BankCustomer /定义字段 private string m_FirstName;private string m_LastName;private decimal m_Balance;/定义构造函数 public BankCustomer(string fn,string ln,decima
2、l balance)this.m_FirstName=fn;this.m_LastName=ln;this.m_Balance=balance;public BankCustomer(string fn,string ln):this(fn,ln,0.0M)/定义属性 public string FirstName get return this.m_FirstName;public string LastName get return this.m_LastName;public decimal Balance get return this.m_Balance;/定义方法 /存钱 publ
3、ic void Deposit(decimal amt)this.m_Balance+=amt;/取钱 public void Withdraw(decimal amt)this.m_Balance-=amt;6.1 定义类类是面向对象中最基本的组成单位。是C#中功能最为强大的数据类型。6.1.1 声明类声明类关键字 ClassClass Customer/Fields,properties,methods and events go here.静态特征的声明可以是字段或属性静态特征的声明可以是字段或属性动态行为的声明利用方法动态行为的声明利用方法6.1.2 创建类的实例创建类的实例创建对象(
4、类实例)使用关键字newCustomer testCustomer=new Customer();public class Person /Field public string name;/Constructor public Person()name=unknown;/Method public void SetName(string newName)name=newName;class TestPerson static void Main()Person person1=new Person();Console.WriteLine(person1.name);person1.SetNa
5、me(John Smith);Console.WriteLine(person1.name);VS2005中的OOP工具类视图对象浏览器6.2 类的字段和属性6.2.1字段字段存储类要满足其设计所需要的数据存储类要满足其设计所需要的数据(类的静态特征类的静态特征)。例:表示日历日期的类可能有三个整数字段:一个表示月份,一个表示日期,还有一个表示年份。在类块中声明字段的方式如下:指定字段的在类块中声明字段的方式如下:指定字段的访问级别访问级别,然,然后指定字段的类型,最后指定字段的名称。后指定字段的类型,最后指定字段的名称。访问对象中的字段是通过在访问对象中的字段是通过在对象对象名称后面依次添加
6、一个句名称后面依次添加一个句点和该字段的名称来实现的。点和该字段的名称来实现的。public class CalendarDate private int month;public int day;int year;CalendarDate test;test=new CalendarDate();test.day;如何访问类中的私有成员?6.2.2 访问修饰限制符访问修饰限制符private:只允许同一个类中的成员访问protected:继承的子类可以对基类有完全访问权internal:允许项目或程序内部的类来访问public:无限制,可以任意存取protected internal =pr
7、otected+internal6.2.3 属性属性属性在内部看像方法,在外部看像字段;字段一般用来表示类的私有特征,属性表示类的公开属性,可以为类字段提供保护,避免字段在对象不知道的情况下被更改;读/写由get/set存取器进行;class TimePeriod private double seconds;public double Seconds get return seconds;set seconds=value;class Program static void Main()TimePeriod t=new TimePeriod();t.Seconds=24;Console.Wr
8、iteLine(Time in hours:+t.Seconds);6.2.3 属性属性只读属性get:获取值,不能赋值只写属性set:设置值6.3 类的方法方法表示类可以做的事情,类拥有的功能。在程序中,方法是一系列语句的代码块,定义类可以执行的操作。方法可以接受提供输入数据的参数,并且可以通过参数返回输出数据。方法还可以不使用参数而直接返回值。6.3.1 方法的声明与调用方法的声明与调用声明时需要指定访问级别访问级别、返回值返回值、方法名称方法名称以及任何方法方法参数参数。方法参数放在括号中,并用逗号隔开。空括号表示方法不需要参数。class Motorcycle public void
9、StartEngine()public void AddGas(int gallons)public int Drive(int miles,int speed)return 0;Motorcycle moto=new Motorcycle();moto.StartEngine();moto.AddGas(15);moto.Drive(5,20);6.3.2 类的构造函数构造函数是在类的的实例被创建时自动被执行的方法,在该方法中可以进行一些初始化的工作。该方法的特点是和类名同名,构造函数可以与普通方法一样自由选择是否带参数。如果您没有为对象提供构造函数,则默认情况下 C#将创建一个构造函数,该
10、构造函数实例化对象,并将所有成员变量设置默认值默认值类可以有多个接受不同参数的构造函数,构造函数间可以相互调用public class Taxi public Taxi()Console.WriteLine(isInitialized Customed Constructor);class TestTaxi static void Main(string args)Taxi t=new Taxi();Console.WriteLine(Output test);public class Employee private int salary;public Employee(int annual
11、Salary)salary=annualSalary;Console.WriteLine(salary);public Employee(int weeklySalary,int numberOfWeeks)salary=weeklySalary*numberOfWeeks;Console.WriteLine(salary);static void Main(string args)Employee e1=new Employee(30000);Employee e2=new Employee(500,52);6.3.3 类的析构函数析构:回收对象中无用的资源一个类只有一个析构函数,自动被调用
12、Cars()Console.WriteLine(“对象被对象被析构析构”);6.3.4静态类及静态方法静态类和类成员用于创建无需创建类的实例就能够访问的数据和函数。类名类名.静态方法名静态方法名类可以声明为static的,以指示它仅包含静态成员。不能使用 new 关键字创建静态类的实例。关键字static:修饰符声明属于类型本身而不是属于特定对象的静态成员。staticstatic 修饰符可用于类、字段、方法、属性、运算符、事件和构造函数。静态成员通常用于表示不会随对象状态而变化的数据或计算。例如,数学库可能包含用于计算正弦和余弦的静态方法。public class Automobile pu
13、blic static int NumberOfWheels=4;public static int SizeOfGasTank get return 15;public static void Drive()public static event EventType RunOutOfGas;/other non-static fields and properties.静态成员在第一次被访问之前并且在任静态成员在第一次被访问之前并且在任何静态构造函数(如调用的话)之前初何静态构造函数(如调用的话)之前初始化。若要访问静态类成员,始化。若要访问静态类成员,应使用类应使用类名名而不是实例名来指定
14、该成员的位置。而不是实例名来指定该成员的位置。Automobile.Drive();int i=Automobile.NumberOfWheels;6.3.5 重载方法方法签名由方法名称和一个参数列表(方法的参数的顺序和类型)组成。只要签名不同,就可以在一种类型内定义具有相同名称的多种方法。当定义两种或多种具有相同名称的方法时,就称作重载。/求两个双精度浮点数的和求两个双精度浮点数的和 static double Add(double x,double y)return x+y;/求两个整数的和求两个整数的和 static int Add(int x,int y)return x+y;/连接两
15、个字符串连接两个字符串 static string Add(string x,string y)return x+y;Add(5,3);Add(5.3,3.5);Add(“Thank”,“You!”);6.5 类的三大特征-封装、继承、多态封装、继承、多态6.5.1 封装封装封装是指把属性和方法(数据和操作这些数据的代码)一起封藏在一个公共结构(类)中。隐藏用户不需要的信息(如实现细节),可以让用户专注于对象中其他有用的特性。(实现方法:访问修饰限制符)便于开发人员改变应用的实现细节,而对象使用者与对象之间的交互方式方面却不需要改变设计类时,尽量隐藏实现细节,只公开那些类使用者需要知道的数据和
16、操作。继承描述了“是什么种类”(is a kind of)的关系继承是指派生类可以获得其基类特征的能力派生类从基类继承属性和方法,实现了代码重用派生类变得更专门化父类父类子类子类动物动物大象大象猫猫6.5.2 继承继承6.5.2 继承继承继承是通过使用派生来实现的,派生类从基类那里派生类从基类那里获得其获得其所有非私有所有非私有的成员的成员派生意味着类是使用基类声明的,它的数据和行为从基类继承。在声明派生类时,在类名称后放置一个冒号,然后在冒号后指定要从中继承的类(即基类)。例:public Class VIPCustomer:BankCustomer注意注意:C#中只支持单继承,但可以实现多
17、个接口;中只支持单继承,但可以实现多个接口;如果要防止被继承,可以使用如果要防止被继承,可以使用sealed关键字(密封类);关键字(密封类);静态类是仅包含静态方法的密封类,也不能被继承。静态类是仅包含静态方法的密封类,也不能被继承。public class Parent public int X;.public class Child:Parent public int Y;.Child obj;obj=new Child();obj.X=10;obj.Y=20;public class Animal protected bool IsSleeping;public void Sleep(
18、)public void Eat()public class Lion:Animal public void StalkPrey()Lion adoptedLion=new Lion();adoptedLion.StalkPrey();adoptedLion.Eat();如何访问基类成员?如何访问基类成员?通过使用base关键字派生类在访问基类的时候有一定的限制,不能访问 private 的成员;internal的基类成员只能被同一个程序集中的派生类访问public class Accountpublic class Account public double balance;public d
19、ouble balance;public public boolbool Withdraw(doubleWithdraw(double amt)amt)balance-=amt;balance-=amt;return true;return true;public class public class CheckAccount:AccountCheckAccount:Account public public boolbool Withdraw(doubleWithdraw(double amt)amt)if(amtif(amt=base.base.balancebalance)return
20、return base.base.Withdraw(amtWithdraw(amt););elseelse return false;return false;6.5.3多态多态同一操作作用于不同的对象,可以有不同的解释,产生不同的同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性执行结果,这就是多态性Animal对象对象ElephantCatMouse行为行为Eat GrassEat MouseEat Cheese被调用的被调用的方法方法Eat()Eat()Eat()创建派生类的目的就是为了扩展基类的功能,创建派生类的目的就是为了扩展基类的功能,并且为解决某个问题提
21、供多种途径。并且为解决某个问题提供多种途径。编写虚方法 使用虚方法定义在派生类中重载的基类方法Base ClassAnimalVirtual MethodEat()Derived ClassCatOverride MethodEat()Eat MouseEat SomethingWhat HappensWhat Happenspublic class Animal public virtual void Eat()Console.WriteLine(Eat something);public class Cat:Animal public override void Eat()Console.
22、WriteLine(Eat small animals);在派生类中使用基类成员 在派生类中,通过使用关键字 base 可以访问基类成员public class Cat:Animal public override void Eat()base.Eat();Console.WriteLine(Eat small animals);6.5.4 抽象方法与抽象类抽象方法与抽象类当创建一个类时,该类对一些方法不提供实现,但是该类的派生类必须实现这些方法,这些方法称为抽象方法。抽象方法是可以看成是没有实现体的空方法没有实现体的空方法如果类中包含抽象方法,那么类就必须定义类就必须定义为抽象类为抽象类,不
23、论是否还包含其它一般方法抽象类是用来作为基类的,不能被实例化抽象类是用来作为基类的,不能被实例化abstract class ShapesClass abstract public int Area();class Square:ShapesClass int x,y;/Not providing an Area method results /in a compile-time error.public override int Area()return x*y;6.6 接口(Interface)6.6.1 什么是接口是引用类型引用类型,它定义了一个规则 规则规定:实现一个接口的类,必须精确
24、地按照该接口的定义来实现该接口的各个成员接口成员接口成员包括:方法、属性、索引器和事件方法、属性、索引器和事件等 不提供成员的实现方式不提供成员的实现方式接口本身可以从多个基接口派生接口本身可以从多个基接口派生interface ICarnivore bool IsHungry get;Animal Hunt();void Eat(Animal victim);接口的定义和类的定义的区别接口的定义和类的定义的区别class 关键字替换成了 interface 关键字,而且其中的方法定义只有方法签名,没有实现没有实现,其中的数据只能是属性,没有数据成员。接口应该描述某种行为接口应该描述某种行为
25、示例:Class Lion:Animal,ICarnivore Class Shark:Animal,ICarnivore Lion 和 Shark 从基类 Animal 继承将食肉动物的行为(ICarnivore)作为接口实现狮子(Lion)“是一种”动物”(Animal);狮子具有食肉动物的行为(ICarnivore)鲨鱼(Shark)“是一种”动物”(Animal);鲨鱼具有食肉动物的行为(ICarnivore)/定义工资接口定义工资接口 public interface IJobdouble ComputeSalary();/定义保险接口定义保险接口public interface I
26、Insurancedouble ComputeInsurance();/定义定义Employee类类public Class Employee:IJob,IInsuranceprivate string employeeID;private double baseSalary;public Employee(string employeeID,double baseSalary)this.empoyeeID=empoyeeID;this.baseSalary=baseSalary;public double ComputeSalary()return this.baseSalary;publi
27、c double ComputeInsurance()return this.baseSalary*0.01;public void SetEmployeeID(string employeeID)this.employeeID=employeeID;public stirng GetEmployeeID()return this.employeeID;public Class Sales:IJob,IInsurancestring employeeID;double baseSalary;double bonus;public Sales(string employeeID,double b
28、aseSalary,double bonus)this.empoyeeID=empoyeeID;this.baseSalary=baseSalary;this.bonus=bonus;public double ComputeSalary()return baseSalary+bonus;public double ComputeInsurance()return baseSalary*0.01;public void SetEmployeeID(string employeeID)this.employeeID=employeeID;public stirng GetEmployeeID()
29、return this.employeeID;/定义类HumanResourcepublic Class HumanResourcepublic static void ProcessSalary(IJob e)Console.WriteLine(薪水=0,e.ComputeSalary();public static void ProcessInsurance(IInsurance e)Console.WriteLine(保险费=0,e.ComputeInsurance();public static void Main()Employee e=new Empoyee(001,5000);Console.WriteLine(员工=0,e.GetEmployeeID);ProcessSalary(e);ProcessInsurance(e);Sales s=new Sales(007,5000,1000);Console.WriteLine(员工=0,s.GetEmployeeID);ProcessSalary(s);ProcessInsurance(s);小结:本章主要讲述了如何设计类:类的组成:字段,属性,索引器,构造函数,方法等类的特性:封装、继承、多态抽象类、接口练习:
限制150内