1、第3章 在C#中实现OOP第第3章章 在在C#中实现中实现OOP3.1 C#中的对象和类中的对象和类3.2 访问修饰符访问修饰符3.3 构造函数和析构函数构造函数和析构函数3.4 方法方法3.5 方法重载方法重载3.6 实例实例1:计算个人所得税:计算个人所得税3.7 命名空间命名空间3.8 C#中的继承中的继承第3章 在C#中实现OOP3.9 综合案例:继承的实现综合案例:继承的实现本章小结本章小结练习与作业练习与作业上机部分上机部分(三三)第3章 在C#中实现OOP学习目标学习目标 理解类、继承的概念 在C#中使用继承 理解C#中构造函数和析构函数的使用 理解方法,在C#中使用方法的重载
2、理解抽象类和抽象方法 在C#中使用接口第3章 在C#中实现OOP3.1 C#中的对象和类中的对象和类 对象object是面向对象开发方法的基本成分。每个对象可以用它本身的一组属性和其上的一组操作来定义。对象可以是现实生活中的一个物理对象,还可以是某一类概念实体的实例。比如一辆汽车、一个人、一本书,乃至一种语言、一个图形、一种管理方式,都可以作为一个对象。从分析和设计的角度来看,对象表示了一种概念,它们把有关的现实世界的实体模型化。实体的有关声明有:描述实体,包括实体的属性和可以执行的操作。比如对于汽车这个对象,它的重量、颜色都可以作为对象的属性,它可以执行的操作是行驶、鸣笛等。第3章 在C#中
3、实现OOP 类class是一组具有相同数据结构和相同操作的对象的集合。类是对一系列具有相同性质的对象的抽象,是对对象共同特征的描述。比如每一辆汽车是一个对象的话,所有的汽车可以作为一个模板,我们就定义汽车这个类。在一个类中,每个对象都是类的实例,可以使用类中提供的方法。从类定义中产生对象,必须有建立实例的操作,C+和C#中的new操作符可用于建立一个类的实例,而C#为我们提供的方法则更加安全。第3章 在C#中实现OOP3.1.1 类的定义类的定义 类是创造对象的模板,每个对象都保护数据,并提供处理和访问数据的方法。定义类的形式为:属性信息 类修饰符 class 类名:基类和任何实现的接口列表
4、/类体 其中,属性信息、类修饰符(见表3-1所示)、基类和任何实现的接口列表、类体为可选项。第3章 在C#中实现OOP表表3-1 类类 修修 饰饰 符符修 饰 符 作 用 new 表明类中隐藏了由基类中继承而来的、与基类中同名的成员和方法 public 表示不限制对该类的访问 protected 表示只能从所在类和所在类派生的子类进行访问 internal 只有其所在类才能访问 private 只有包.Net 中的应用程序或库才能访问 abstract 抽象类不允许建立类的实例 sealed 密封类不允许被继承 protected internal 访问仅限于从所在类派生的当前项目或类 第3章
5、 在C#中实现OOP 最简单的类定义,只要在类名前放置class关键字,然后在一对花括号内插入类的成员即可。其形式为:class类名 类成员 例如:class Employee private long employeeId;这里定义了一个名为Employee的类,其中包括一个名为employeeId的成员。在成员前面的关键字private称为访问修饰符,C#定义了四个合法的访问修饰符。第3章 在C#中实现OOP3.1.2 类成员类成员 类的成员可以分为两大类:类本身所声明的,以及从基类中继承而来的。类的成员有以下类型:常量,是具有不能改变的一个值的域。域,即类中的变量。方法,是指在对象的数据
6、(或域)上操作的实际代码,它可以是表态方法,也可以是实例方法。属性,用于定义类中的值,并对它进行读写。属性对用户是抽象的,因为它们是实际的方法,像类的用户的域。事件,用于说明发生了什么事情。第3章 在C#中实现OOP 索引器,索引允许对象以数组或集合的方式进行索引。索引器就是一个成员让一个对象通过get和set访问器进行索引,即对对象设置值和获得值索引。运算符,C#使我们能通过运算符重载对一个类增加标准的数学运算符,以便通过使用这些运算符编写更直观的代码。构造函数和析构函数,分别用于对类的实例进行初始化和销毁。第3章 在C#中实现OOP3.2 访访问问修修饰饰符符 对一个类的成员可以指定不同的
7、访问修改符见表3-2,以其表明其可见或可访问。注意:注意:除非需要一个成员具有默认访问的修饰符private,否则均需对成员指定访问修饰符。例如,下列代码定义成员a、b、c为public成员;d、e为protected成员:class testA public int a;public int b;public int c;protected int d;protected int e;第3章 在C#中实现OOP 而下列代码则定义a为public成员;而b为private成员(通过默认):class testB public int a;int b;第3章 在C#中实现OOP表表3-2 C#访
8、问修饰符访问修饰符修饰符 作 用 public 表示该成员从类定义的外部和派生类的层次都是可以访问的,即可以在任何地方被访问,包括类的外部 protected 表示该成员在类外部是不可视的,而只能由派生类进行访问,即可以在它所属的内部被访问,或在派生类中被访问 private 表示该成员不能在定义类的作用域外部进行访问。因此,派生类不能访问这些成员,仅在它所属的类的内部被访问 internal 表示该成员只在当前编译单元内是可视的,internal访问修饰符创建public和 protected的混合访问,取决于其存在代码,可以在同一程序中被访问 第3章 在C#中实现OOP3.3 构造函数和析
9、构函数构造函数和析构函数3.3.1 构造函数构造函数 构造函数用于执行类的实例的初始化。每个类都有构造函数,即使我们没有声明它,编译器也会自动地为我们提供一个默认的构造函数。在访问一个类的时候,系统将最先执行构造函数中的语句。声明构造函数的形式为:访问修饰符 类名()/构造函数的主体第3章 在C#中实现OOP 实际上,任何构造函数的执行都隐式地调用了系统提供默认的构造函数base()。如果我们在类中声明了如下的构造函数:C()它等价于:C():base()注意:注意:一个类的构造函数通常与类名相同。构造函数不声明返回类型。一般地,构造函数总是public类型的。如果是private类型的,表明
10、类不能被实例化,这通常用于只含有静态成员的类。第3章 在C#中实现OOP 在构造函数中不要做对类的实例进行初始化以外的事情,也不要尝试显式地调用构造函数。创建对象和调用构造函数均需用new运算符来实现,使用形式为:类名 对象=new 类名();或类名 对象对象=new 类名()【例例3-1】简单构造函数的使用。using System;using System.Collections.Generic;using System.Text;第3章 在C#中实现OOP namespace Demo3_1 class A public A()Console.WriteLine(Im the const
11、ructor);public static void Main()A Aa=new A();/实例化对象 程序运行结果如图3-1所示。第3章 在C#中实现OOP图3-1 例3-1运行结果第3章 在C#中实现OOP 【例例3-2】默认构造函数的使用。using System;using System.Collections.Generic;using System.Text;namespace Demo3_2 class Employee private string _name;private char _gender;private string _qualification;private
12、 uint _salary;/默认构造函数 public Employee()_qualification=研究生;第3章 在C#中实现OOP static void Main(string args)/调用默认构造函数 Employee objEmployee=new Employee();Console.WriteLine(资格=+objEmployee._qualification);Console.WriteLine(薪水=+objEmployee._salary);例3-2中定义了_name、_gender、_qualification和_salary四个成员变量和一个构造函数Emp
13、loyee。程序运行输出结果如图3-2所示。第3章 在C#中实现OOP图3-2 例3-2运行结果第3章 在C#中实现OOP3.3.2 带参数的构造函数带参数的构造函数 构造函数可以是不带参数的,这样对类的实例的初始化是固定的。有时我们在对类进行实例化时,需要传递一定的数据,来对其中的各种数据进行初始化。这时,我们可以使用带参数的构造函数,来实现对类的不同实例的不同初始化。在带有参数的构造函数中,类在实例化时必须传递参数,否则该构造函数不被执行。带参数的构造函数声明形式:访问修饰符 类名(参数列表)/构造函数的主体 第3章 在C#中实现OOP 创建对象和调用构造函数均需用new运算符来实现,使用
14、形式为:类名 对象=new 类名(参数列表);或类名 对象对象=new 类名(参数列表)【例例3-3】带参数的构造函数的应用。using System;using System.Collections.Generic;using System.Text;namespace Demo3_3 class class1第3章 在C#中实现OOP int a=0,b=0,c;public class1()c=0;public class1(int a,int b,int c)/带参数的构造函数 this.a=a;this.b=b;this.c=c;public static void Main()cl
15、ass1 class1=new class1();class1 class2=new class1(1,2,3);第3章 在C#中实现OOP Console.WriteLine(0,1,2),class1.a,class1.b,class1.c);Console.WriteLine(0,1,2),class2.a,class2.b,class2.c);程序的运行结果如图3-3所示。第3章 在C#中实现OOP图3-3例3-3运行结果第3章 在C#中实现OOP 【例例3-4】带参数的构造函数的应用。带参数的构造函数的应用。using System;using System.Collections.
16、Generic;using System.Text;namespace Demo3_2 class Employee private string _name;private char _gender;private string _qualification;private uint _salary;第3章 在C#中实现OOP/默认构造函数 public Employee()_qualification=大学毕业生;/参数化构造函数 private Employee(string strqualification,string strname,char gender,uint empsala
17、ry)_qualification=strqualification;_name=strname;_gender=gender;_salary=empsalary;第3章 在C#中实现OOP static void Main(string args)/调用默认构造函数 Employee objEmployee=new Employee();/调用参数化构造函数 Employee objMBA=new Employee(工商管理硕士,Tomy,M,40000);Console.WriteLine(默认构造函数输出:n资格=+objEmployee._qualification);Console.
18、WriteLine(n参数化构造函数输出:资格=+objMBA._qualification);程序运行结果如图3-4所示。第3章 在C#中实现OOP图3-4例3-4运行结果第3章 在C#中实现OOP3.3.3 析构函数析构函数 在类的实例超出范围时,我们希望确保它所占的存储能被收回。C#中提供了析构函数,用于专门释放被占用的系统资源。析构函数的名字与类名相同,只是在前面加了一个符号“”。析构函数不接受任何参数,也不返回任何值。如果你试图声明其它任何一个以符号“”开头而不与类名相同的方法,和试图让析构函数返回一个值一样,编译器都会产生一个错误。析构函数的语法:类名()/析构函数的主体 注意:注
19、意:在一个类中只能定义一具析构函数。第3章 在C#中实现OOP 【例例3-5】使用析构函数更新例3-3中的class1类。using System;using System.Collections.Generic;using System.Text;namespace Demo3_5 class class1 int a=0,b=0,c;public class1()c=0;public class1(int a,int b,int c)/带参数的构造函数第3章 在C#中实现OOP this.a=a;this.b=b;this.c=c;class1()a=0;b=0;c=0;public st
20、atic void Main()第3章 在C#中实现OOP class1 class1=new class1();class1 class2=new class1(1,2,3);Console.WriteLine(0,1,2),class1.a,class1.b,class1.c);Console.WriteLine(0,1,2),class2.a,class2.b,class2.c);程序运行结果如图3-5所示。注意:在一个类中只能定义一个析构函数,可以认为析构函数是构造函数的相反操作,当对象被创建时执行构造函数,当对象被破坏并由垃圾回收工具收集时执行析构函数。第3章 在C#中实现OOP图3
21、-5 例3-5运行结果第3章 在C#中实现OOP3.4 方方 法法 方法是执行时返回某种类型的值的语句块。通过名称调用方法,可执行该方法中的语句。一种方法至少由下列部分组成:返回类型,方法名称,参数表和方法体。3.4.1 声明方法声明方法 方法(又称成员参数)是类中执行计算或其他行为的成员。方法的声明格式为:属性信息 方法修饰符 返回类型 方法名(形参表)/方法主体第3章 在C#中实现OOP其中,方法修饰符可以是表3-3所列的修饰符,可以有一个或多个修饰符,默认情况为privte。返回值的类型可以是任何一种C#的数据类型。C#在方法体中通过return语句得到返回值,该返回值可以赋给变量,以便
22、在程序中使用;如果方法没有返回值,就把返回类型指定为void。方法名(又称成员方法名)集中体现了类或对象的行为。方法名不能与同一类中的其他方法同名,也不能与类中的其他成员同员。方法的形参表是传递给方法的参数声明,C#中方法的参数有四种类型:(1)值参数,不附加任何修饰符。第3章 在C#中实现OOP (2)引用参数(地址参数),以ref修饰符声明。(3)输出参数,以out修饰符声明,其能返回多于一个值给调用者。(4)数组参数,以params修饰符声明。如果方法不带参数,则需在方法名后加()。方法体是方法的执行体,可以是C#的任一合法语句。如果方法是使用了abstract和extern修饰符的方法
23、,则方法的执行体仅仅是一个简单的分号。其他所有的方法执行体应包含调用该方法所要执行的语句。第3章 在C#中实现OOP表表3-3 方方法法修修饰饰符符修饰符 说 明 public 该方法可以在任何地方被访问,包括类的外部 new 该方法隐藏了同名的继承方法 protected 该方法可以在它所属的类内或派生类中被访问 private 该方法可以在它所属的类内被访问 internal 该方法可以在同一程序中被访问 Static 该方法不能在类的特定实例上执行 virtual 该方法可以被派生类的类重用 abstract 该虚拟方法定义了方法名,但提供执行方式 override 该方法重写继承的方法
24、或抽象的方法 sealed 该方法重用继承的虚拟方法,但不能被派生于这个类的其他类重用,必须和重写方法一起使用 extern 该方法在外部用另一种语言被执行 第3章 在C#中实现OOP3.4.2 调用方法调用方法 要调用方法,只需给出调用该方法的对象名,随后是方法名及放在圆括号中的参数列表。如果方法传送返回类型,可以把这个值存放在变量中,把它用作另一方法的参数,或者放弃它。方法调用的一段形式为:对象.方法名(实参表)如果是在同一个类的内部调用方法,则不需要指定对象名,形式为:方法名(实参表)注意:注意:(1)调用和被调用的方法名必须一致。(2)调用方法的实参和被调用方法形参的类型个数和顺序必须
25、一致.第3章 在C#中实现OOP 【例例3-6】调用一个简单的方法,输入a、b两个数,求其和。using System;using System.Collections.Generic;using System.Text;namespace Demo3_6 class sum public float add(float x,float y)return x+y;第3章 在C#中实现OOP class sumtest public static void Main()string s;float a,b;sum obj=new sum();/创建一个对象 Console.Write(Enter
26、 value of a:);s=Console.ReadLine();a=float.Parse(s);Console.Write(Enter value of b:);s=Console.ReadLine();第3章 在C#中实现OOP b=float.Parse(s);float sum=obj.add(a,b);/调用add方法 Console.WriteLine(sum=0,sum);运行程序结果如图3-6所示。第3章 在C#中实现OOP图3-6 例3-6运行结果第3章 在C#中实现OOP 参数传递有两种形式:按引用调用和按值调用。按引用调用可以由被调用的方法对变量进行各种改变,而按值
27、调用的变量不会在方法体内进行任何改变,这是因为按引用调用传送变量时,方法引用的是原来的变量,而按值调用传送变量时,方法引用的是这些变量的副本。C#中,默认状态下是选择按值调用的。下面通过一个例子来说明。【例例3-7】方法的输入参数。using System;using System.Collections.Generic;using System.Text;namespace Demo3_7 class Program第3章 在C#中实现OOP /两个参数:数组参数和方法的输入参数 static void Function(int ints,int i)ints0=88;i=88;public
28、 static int Main()/原值 int i=0;int ints=0,1,2,4,8;/输出原值 Console.WriteLine(i=+i);第3章 在C#中实现OOP Console.WriteLine(ints0=+ints0);Console.WriteLine(参数传递之后.);/参数传递 Function(ints,i);/输出结果 Console.WriteLine(i=+i);Console.WriteLine(ints0=+ints0);return 0;程序运行结果如图3-7所示。说明:在程序运行后,i的值没有发生变化,ints的值改变了。第3章 在C#中实现
29、OOP图3-7 例3-7运行结果第3章 在C#中实现OOP3.5 方方 法法 重重 载载 像Java和C+一样,C#允许在类中声明多于两个的同名方法,这称为重载。重载方法的参数个数和类型必须不同,或者两者至少有一个必须不同,以使得编译器能根据调用时所提供的参数,就知道应该调用哪一个方法。3.5.1 基于不同数量的参数的方法重载基于不同数量的参数的方法重载 若方法的名称相同,调用方法时,则根据方法参数的个数调用相应的方法。如:long square(int n,int m)return n*m;第3章 在C#中实现OOP double square(int n,int m,int p)retur
30、n n*m*p;以上程序中的两个方法都叫square,但第一个方法有两个参数,第二个方法有三个参数,调用时取决于传递参数是两个还是三个。【例例3-8】基于不同数量的参数的方法重载应用。using System;using System.Collections.Generic;using System.Text;namespace Demo3_8 class overloads第3章 在C#中实现OOP /两个参数的greatest方法 int greatest(int num1,int num2)Console.WriteLine(0 和 1 相比,最大的是:,num1,num2);if(nu
31、m1 num2)return num1;else return num2;第3章 在C#中实现OOP /三个参数的greatest方法 int greatest(int num1,int num2,int num3)Console.WriteLine(0,1 和 2 相比,最大的是:,num1,num2,num3);if(num1 num2&num1 num3)return num1;else if(num2 num1&num2 num3)return num2;else return num3;第3章 在C#中实现OOP static void Main()overloads obj=new
32、 overloads();Console.WriteLine(obj.greatest(45,67);Console.WriteLine(obj.greatest(23,56,87);说明:说明:上述程序定义了两个求最大值的greatest方法,一个方法有两个参数,另一个方法有三个参数,在调用方法时应根据参数的数量来调用相应的方法。程序运行结果如图3-8所示。第3章 在C#中实现OOP图3-8例3-8运行结果第3章 在C#中实现OOP3.5.2 基于不同类型的参数的方法重载基于不同类型的参数的方法重载 当方法名称相同,调用方法时则取决于参数传递的类型,根据不同的类型调用相应方法。如:long
33、square(int n)return n*n;double square(float n)return n*n;以上程序第一个方法是取一个int作为参数,而第二个方法是取float作为参数,调用时取决于传递int还是float作为参数。第3章 在C#中实现OOP 注意:注意:返回类型在确定重载时并不起任何作用,因为它可调用一个函数,而不使用返回值。long square(int n)return n*n;double square(int n)return n*n;square(3);/因参数类型相同,而返回值类型又不起作用,所以不编译第3章 在C#中实现OOP 【例例3-9】基于不同类型的
34、参数的方法重载应用。using System;using System.Collections.Generic;using System.Text;namespace Demo3_9 class overloads /参数类型为int int greatest(int num)int temp=num0;for(int i=1;inum.Length;i+)第3章 在C#中实现OOP if(tempnumi)temp=numi;return temp;/参数类型为double double greatest(double num)double temp=num0;for(int i=1;i n
35、um.Length;i+)if(temp numi)temp=numi;第3章 在C#中实现OOP return temp;static void Main()overloads obj=new overloads();int intnums=13,45,23,67,89;double doubnums=1.4,53.2,67.8,21.1,4.5;Console.WriteLine(最大的整数是:+obj.greatest(intnums);Console.WriteLine(最大的小数是:+obj.greatest(doubnums);第3章 在C#中实现OOP 说明:说明:程序定义两个求
36、最大值的greatest方法,一个方法的参数类型是int,另一个方法的参数类型是double,在调用方法时应根据参数的类型来调用相应的方法。程序运行结果如图3-9所示。图3-9例3-9运行结果第3章 在C#中实现OOP3.5.3 静态方法静态方法 静态方法是在一个类中,作为一个全体而不是作为一个类的特定实例存在的一种方法,和使用其他静态成员一样。静态方法的主要好处是:它们与一个类的特定实例无关,即它不属于某一个具体的实例。静态方法只能访问类中的静态成员,而非静态方法可以访问类中的任何成员。静态方法使用static关键字修饰。其定义形式为:方法修饰符static返回类型方法名(形参表)方法体 也
37、可从Main方法内调用静态方法,其调用形式为:类名.静态方法名(参数表)第3章 在C#中实现OOP 【例例3-10】静态方法的调用与使用。using System;using System.Collections.Generic;using System.Text;namespace Demo3_10 class statictest public static void test()/静态方法 Console.WriteLine(Hello,static.);第3章 在C#中实现OOP class StaticMethod1App public static void Main()图3-10
38、 例3-10运行结果 statictest.test();/调用静态方法 程序运行结果如图3-10所示。可见,使用static关键字定义一个静态方法,用户使用“类名.方法”的语法来调用该方法。注意,即使用户具有类实例的引用,这个语法也是必要的。第3章 在C#中实现OOP图3-10 例3-10运行结果第3章 在C#中实现OOP3.6 实例实例1:计算个人所得税:计算个人所得税 假定每个税种的计算都需要不同的计算方法,请编写一个程序,根据个人财产、销售额和收入来计算所得税。请为以下几种情形计算所得税。如果某人拥有住房但没有自己的公司,则以房产价值计算所得税。如果某人没有住房但拥有一家公司,则以其总
39、销售额计算所得税。如果某人同时拥有住房和一家公司,则以房产价值和总销售额计算所得税。不论是否拥有住房和公司,都会计算个人收入所得税。第3章 在C#中实现OOP 分析:从给出的问题来看,只有一种基本运算,即使用多种不同的方式计算所得税。(1)如果某人拥有住房或一家公司,则通过将总金额(可能分别为房产价值或总销售额)乘以住房费率或总销售额的百分比(费率除以100)来计算所得税。因此:所得税=总金额 (2)如果某人同时拥有住房和公司,则所得税的计算公式与上面的类似,但是要分别计算各项金额和费率。因此:所得税=金额1 +金额2100费率1001 费率1002 费率第3章 在C#中实现OOP (3)通过
40、将个人收入乘以0.15计算个人收入所得税。所得税=0.15总金额 虽然计算所得税的方法有以上三种,但是更合理的做法就是只使用一种方法,然后以不同的参数重载方法,从而执行不同的操作。实现步骤:(1)创建一个名为“lesson3 Example1”的控制台应用程序。(2)将class1.cs更名为Taxes.cs。(3)将以下代码添加到“Taxes.cs”中:using System;using System.Collections.Generic;using System.Text;第3章 在C#中实现OOPnamespace Lesson3_Example1 class Taxes publi
41、c double ComputeTax(double amt)double taxRate=0.15;double taxAmt=0;taxAmt=amt*taxRate;Console.WriteLine(n个人收入所得税的计算结果是0,taxAmt);return taxAmt;public double ComputeTax(double amt1,double rate1,string str)double taxAmt;第3章 在C#中实现OOP taxAmt=amt1*(rate1/100);if(str=home)Console.Write(n 根据住房率和房价值算出的所得税是)
42、;else if(str=business)Console.Write(n 根据住房率和销售额算出的所得税是);Console.WriteLine(taxAmt);return taxAmt;public double ComputeTax(double amt1,double rate1,double amt2,double rate2)第3章 在C#中实现OOP double taxAmt;taxAmt=(amt1*rate1/100)+(amt2*rate2/100);Console.WriteLine(n根据房产价值、住房费率、+总销售额和总费率算出的所得税是.,taxAmt);ret
43、urn taxAmt;STAThread static void Main(string args)Taxes objTaxes=new Taxes();bool ownsHome=false;bool ownsBusiness=false;string choice;double homeTaxRate=0,homeValue=0;第3章 在C#中实现OOP double grossSalesRate=0;double grossSales=0;double personalIncome=0;double TotalTax=0;double TaxRate=0;Console.WriteLi
44、ne(是否拥有住房?(y/n);choice=Console.ReadLine();if(choice=y)ownsHome=true;Console.WriteLine(它的价值是多少?);choice=Console.ReadLine();homeValue=Convert.ToDouble(choice);Console.WriteLine(住房税率是多少?);第3章 在C#中实现OOP choice=Console.ReadLine();homeTaxRate=Convert.ToDouble(choice);Console.WriteLine(是否拥有一家公司?(y/n);choic
45、e=Console.ReadLine();if(choice=y)ownsBusiness=true;Console.WriteLine(总销售额是多少?);choice=Console.ReadLine();grossSalesRate=Convert.ToDouble(choice);if(ownsHome&!ownsBusiness)第3章 在C#中实现OOP TotalTax=objTaxes.ComputeTax(homeValue,homeTaxRate,home);else if(!ownsHome&ownsBusiness)TotalTax=objTaxes.ComputeTa
46、x(grossSales,grossSalesRate,business);else if(ownsHome&ownsBusiness)TotalTax=objTaxes.ComputeTax(homeValue,homeTaxRate,grossSales,grossSalesRate);Console.WriteLine(去年的总收入是多少?);choice=Console.ReadLine();第3章 在C#中实现OOP personalIncome=Convert.ToDouble(choice);TotalTax=TotalTax+objTaxes.ComputeTax(person
47、alIncome);Console.WriteLine(总所得税是0,TotalTax);TaxRate=0.15;Console.WriteLine(个人所得税率是0,TaxRate);(4)选择“生成”“生成解决方案”选项,以生成此项目。(5)选择“调试”“开始执行(不调试)”选项来执行此应用程序。根据输入的信息程序输出结果如图3-11所示。第3章 在C#中实现OOP图3-11实例1运行结果第3章 在C#中实现OOP 说明:说明:由于C#支持重载,我们可以把计算税费方法的名字都取为ComputeTax,在调用方法时,只需在其中带入参数,编译器就会根据实参类型和参数数量来决定到底调用哪个重载
48、方法。第3章 在C#中实现OOP3.7 命命 名名 空空 间间 C#程序是利用命名空间组织起来的。命名空间既用作程序的“内部”组织系统,也用作“外部”组织系统(一种向其他程序公开自己拥有的程序的方法)。这是一种非常有效的组织系统的方法。比如在C#中,为了编写程序的方便,已经预先提供了名目繁多的类(大约5000多个),另外,各程序员甚至我们自己也会根据需要在程序中设计自己的类和类库,这样就可能会导致在程序代码中存在两个同名的类。怎么在程序代码中区分这两个类呢?命名空间就能够很好地解决这个问题。命名空间提供一种树状层次结构来组织类,以免类名冲突。第3章 在C#中实现OOP 命名空间的声明格式如下:
49、namespace 命名空间名 /命名空间主体 注意:命名空间的声明要么在源文件的第一行出现,要么作为成员出现在其他名称空间的声明之中。命名空间不允许出现重名。每当在C#中新建一个项目时,集成开发环境都会自动生成一个与项目名称相同的命名空间。例如,新建一个控制台项目MyTest,会自动产生一个命名空间MyTest,如下所示:第3章 在C#中实现OOP using system;namespace MyTest /命名空间 /命名空间主体 命名空间隐式的使用public修饰符,在声明时不允许使用任何访问修饰符。命名空间可以嵌套,如:namespace N1 namespace N2 Class
50、A Class B 第3章 在C#中实现OOP 上面这种形式可以采用嵌套的语法来实现命名空间的嵌套声明:namespace N1.N2 Class AClass B 命名空间成员可以是一个类型(类、结构、接口、枚举或委托),也可以是另一个命名空间。第3章 在C#中实现OOP 引入命名空间以后,要使用该命名空间内的成员必须要在空位的前面加上一长串的命名空间的限定,这显然很不方便。为了简洁代码,C#语言中使用using语句来导入命名空间。using语句一般情况下被放在所有语句的前面。每个源文件中可以使用多个using语句,每行一个语句。如:using system;using system.mat
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。