第四章 在 C# 中实现 OOP 概念
回顾 2-1 变量是存放特定数据类型的值的容器,而常量也存放特定数据类型的值,但常量在整个程序中都保持不变 装箱是将值类型转换为引用类型,拆箱则是将引用类型转换为值类型 C# 提供以下类型的选择结构: if if…else switch…case C# 提供以下类型的循环结构: while 循环 do 循环 for 循环 foreach 循环
回顾 2-2 数组是可用于将类型相同的多个数据元素存储为一个实 体的数据结构 C# 中的结构可以在其内部定义方法并可包括一个构造函 数枚举是一组已命名的数字常量
目标 理解 C# 的类和对象 使用 C# 构造函数和析构函数 使用 C# 访问修饰符 使用方法 理解命名空间
对象 属性 行为 型号 行驶 价格 起动 停车 里程 属性 行为 名称 犬 吠 属性 行为 颜色 摇尾巴 品种 吃东西 车轮数量 刹车 犬 吠 属性 行为 颜色 摇尾巴 品种 吃东西 车轮数量 刹车 档的数量 加速 换档
类 类是 C# 中的一种结构,用于在程序中模拟现实生活的事物 语法: [访问修饰符] class <类名> { // 类的主体 } 示例: class Employee { // 类的主体 } // 成员变量 // 成员方法
成员变量 语法: … class Employee { private string _name; private char _gender; private string _qualification; private uint _salary; } [访问修饰符] 数据类型 成员变量; private int _name protected char status internal …. …. public bool userName 访问成员变量 步骤 1:创建一个类的对象 Employee objEmployee = new Employee(); 步骤 2:使用点号访问成员变量 objEmployee._name = “张三"; objEmployee._name = 'M';
只有 Student 类在 Teacher 类都在同一程序集中,才可访问internal成员 访问修饰符 2-1 Teacher 类 Student 类 private 成员 不可访问 protected 成员 不可访问 public 成员 可以访问 只有 Student 类在 Teacher 类都在同一程序集中,才可访问internal成员 internal 成员
访问修饰符 2-2 修饰符 说明 public internal private protected 所属类的成员以及非所属类的成员都可以访问 internal 当前程序集可以访问 private 只有所属类的成员才能访问 protected 所属类或派生自所属类的类型可以访问
构造函数 2-1 构造函数是类的一种特殊方法,每次创建类的实例都会调用它 语法: [访问修饰符] <类名>() { // 构造函数的主体 } 示例: … // 默认构造函数 Employee() { _qualification = "研究生"; }
构造函数 2-2 演示:示例 1 class Employee { private string _name; private char _gender; private string _qualification; private uint _salary; // 默认构造函数 private Employee() { _qualification = “研究生"; } static void Main(string[] args) { // 调用默认构造函数 Employee objEmployee = new Employee(); Console.WriteLine(“资格= " + objEmployee._qualification); Console.WriteLine(“薪水= " + objEmployee._salary); } 演示:示例 1
参数化构造函数 2-1 语法: [访问修饰符] <类名> () ([参数列表]) { // 构造函数的主体 } 示例: … // 参数化构造函数 Employee(string strQualification) { _qualification = strQualification; }
参数化构造函数 2-2 public static void Main(string[] args) { // 默认构造函数 // 调用默认构造函数 Employee objGraduate = new Employee(); // 调用参数化构造函数 Employee objMBA = new Employee(“ACCPS3“, ”张亮影“, ‘男', 5500); Console.WriteLine(“默认构造函数输出: \n资格=“ + objGraduate._qualification); Console.WriteLine(“\n参数化构造函数输出: \n资格= " +objMBA._qualification); } // 默认构造函数 private Employee() { _qualification = “研究生"; } // 参数化构造函数 private Employee(string strQualification, string strName, char gender, uint empSalary) { _qualification = strQualification; _name = strName; _gender = gender; _salary = empSalary; }
析构函数 是用于执行清除操作的特殊方法 语法: ~ <类名>()0 { // 析构函数的主体 } 示例: … ~Employee() { }
方法 对象的行为 PickUp() Ring() { { …. …. //用于传送和接收信号的代码 //用于显示主叫号码的代码 } } 接听 响铃 挂断 Hang() { …. //用于结束会话的代码 }
声明方法 2-1 语法 访问修饰符(可选),默认情况下为 private 如果不需要返回任何值,方法可能返回 void 数据类型 [访问修饰符] 返回类型 <方法名>([参数列表]) { // 方法主体 } 访问修饰符(可选),默认情况下为 private 如果不需要返回任何值,方法可能返回 void 数据类型
声明方法 2-2 方法 Assign() 的定义 ….. class Point { int x; int y; void Assign() System.Console.WriteLine(“输入点的值"); x = int.Parse(System.Console.ReadLine()); y = int.Parse(System.Console.ReadLine()); } 方法 Assign() 的定义 Assign( ) 方法 不返回任何值 (void) 不接收任何值 (Assign())
调用方法 3-1 语法 对象名.方法名([参数列表]); 实例 点号 类中的方法
调用方法 3-2 演示:示例 3 objParam1 与 objNumber2 相关联 private void Accept() { Console.WriteLine(“请输入实数部分"); _real = int.Parse(Console.ReadLine()); Console.WriteLine(“请输入虚数部分"); _imaginary = int.Parse(Console.ReadLine()); } void ShowResult() Console.WriteLine(“相加之和为:"); Console.WriteLine(_real + "+" + _imaginary + "i"); // 此方法用于将两个复数相加 ComplexNumber Add(ComplexNumber objParam1) objParam1._real += _real ; objParam1._imaginary += _imaginary; return objParam1; 调用方法 3-2 [STAThread] public static void Main(string[] args) { ComplexNumber objNumber1 = new ComplexNumber(); ComplexNumber objNumber2 = new ComplexNumber(); objNumber1.Accept(); objNumber2.Accept(); ComplexNumber objTemp = objNumber1.Add(objNumber2); objTemp.ShowResult(); } 接收实部和虚部的值 显示实部和虚部的值 objParam1 与 objNumber2 相关联 演示:示例 3 请参阅对象的实例变量
调用方法 3-3 return 语句 语法 return [表达式];
方法重载 4-1 电话 电 管理层 帐单 电信 固定电话 电 对不同的数据执行相同的任务 消费者 1 移动电话 供应商 1 电 供应商 2
方法重载 4-2 对不同数据执行相似的功能 … Class BillPayment { void PayBill(int telephoneNumber) //此方法用于支付固定电话话费 } void PayBill(long consumerNumber) //此方法用于支付电费 void PayBill(long consumerNumber, double amount) //此方法用于支付移动电话话费 对不同数据执行相似的功能
方法重载4-3 具有不同数量的参数的方法重载 int greatest(int num1, int num2) { Console.WriteLine(“{0} 和 {1} 相比, 最大的是: ", num1, num2); if(num1 > num2) return num1; } else return num2; int greatest(int num1, int num2, int num3) Console.WriteLine(“{0}, {1} 和 {2} 相比, 最大的是: ", num1, num2, num3); if(num1 > num2 && num1 > num3) else if(num2 > num1 && num2 > num3) return num3; 具有不同数量的参数的方法重载
方法重载 4-4 具有不同类型的参数的方法重载 int greatest(int[] numbers) { int temp = numbers[0]; for(int i = 1;i < numbers.Length;i++) if(temp < numbers[i]) temp = numbers[i]; } return temp; double greatest(double[] numbers) double temp = numbers[0]; 具有不同类型的参数的方法重载
命名空间 6-1 英国 纽卡斯尔 澳大利亚 纽卡斯尔
命名空间 6-2 类库 命名空间 AdminDept 命名空间 ITDept AdminDept.Manager Class Manager { long int salary; ……… } ……. { long int salary; ……. ……… } Class Manager AdminDept.Manager ITDept.Manager
Class SamsungTelevision 命名空间 6-3 namespace Sony { class Television ... } class WalkMan namespace Samsung { class Television ... } class WalkMan Class SamsungTelevision { } Class SonyTelevision { } 长名称难以维护 Class SonyWalkman { } Class SamsungWalkman { } 有条理,有结构 Samsung.Television Sony.Television
命名空间 6-4 语法 namespace 命名空间的名称 { // 该名称空间的所有类都放在这里。 }
命名空间 6-5 namespace Samsung { class Monitor public void ListModels() Console.WriteLine(“供应以下型号的显示器:"); Console.WriteLine("14\", 15\" \n"); } [STAThread] static void Main(string[] args) // // TODO: 在此处添加代码以启动应用程序
命名空间 6-6 namespace Sony { public class Monitor public void ListModelStocks() Console.WriteLine(“以下是 Sony 显示器的规格及其库存量:"); Console.WriteLine("14\"=1000, 15\"=2000, 17\"=3000"); } static void Main(string[] args) Samsung.Monitor objSamsung = new Samsung.Monitor(); Monitor objSony = new Monitor(); objSamsung.ListModels(); objSony.ListModelStocks(); 命名空间 6-6
总结 类是 C# 中的一种结构,用于在程序中模拟现实生活的对象 成员变量表示对象的特征 方法表示对象可执行的操作 如果类中未定义构造函数,则由运行库提供默认构造函数 析构函数不能重载,并且每个类只能有一个析构函数 可以根据不同数量的参数或不同数据类型参数对方法进行重载,不能根据返回值进行方法重载 命名空间用来界定类所属的范围,类似于Java中的包