C#面向对象程序设计 $6 深入理解类
面向对象的方法学 面向过程的方法 功能与数据分离 自顶向下的分析 基于模块的设计 面向对象的方法 数据+操作对象 对象+类+继承+通信
面向对象的方法学 对象类(抽象化) Shape
面向对象的方法学 对象类(抽象化) 类对象(具体化) Student 范小飞 2年级1班 王艳 2年级3班 刘强 5年级1班
面向对象的方法学 继承 Shape Triangle Rectangle Ellipse Polygon Square Circle
深入理解类 类的成员
类的成员 数据成员 字段 方法成员 普通方法 构造函数和析构函数 属性 索引函数 事件 操作符
类的成员 构造函数 静态构造函数 构造函数的名称与类名相同 构造函数不声明返回类型 构造函数通常是公有的(public修饰符声明),否则(私有/保护)该构造函数不能用于类的实例化 实例构造函数:对象初始化 带参构造函数:按需求初始化 静态构造函数 在程序中第一次用到某个类时,类的静态构造函数自动被调用,而且仅此一次。 静态构造主要用于类的静态字段进行初始化,它不能使用任何限制修饰符。
构造函数示例 //程序清单P6_1.cs: using System; namespace P6_1 { public class ConstructorSample public static void Main() Contact c1 = new Contact(); c1.Output(); Contact c2 = new Contact("赵丽"); c2.Output(); Contact c3 = new Contact("李明", 25, true); c3.Output(); } public class Contact { public string m_name; protected int m_age = 0; protected bool m_gender = false; //默认构造函数 public Contact() m_name = "Unknown"; } //带参数的构造函数 public Contact(string name) m_name = name;
构造函数示例(续) public Contact(string name, int age, bool gender) { m_name = name; m_age = age; m_gender = gender; } //析构函数 ~Contact() { } //普通方法 public void Output() Console.WriteLine("姓名{0} 年龄{1} 性别{2}", m_name, m_age, m_gender ? '男' : '女');
静态构造函数示例 //程序清单P6_2.cs: using System; namespace P6_2 { public class StaticConstructorSample public static void Main() Contact c1 = new Contact("李明"); Contact c2 = new Contact("赵丽"); Contact c3 = new Contact("王强"); } public class Contact { public string m_name; public static int m_objects = 0; public static int m_classes = 0; //构造函数 public Contact(string name) Console.WriteLine("构造对象: " + name); m_name = name; m_objects++; Console.WriteLine("对象数量: " + m_objects); } //静态构造函数 static Contact() Console.WriteLine("构造类"); m_classes++; Console.WriteLine("类数量: " + m_classes);
类的成员 析构函数 关于析构函数的执行在第7章举例 析构函数的名称与类名相同,但在前面需要加一个符号“~” 析构函数不接受任何参数,也不返回任何值 析构函数不能使用任何访问限制修饰符 析构函数通常只进行销毁对象的工作,而不因该执行其他的操作 析构函数不能被继承,也不能被显示地调用 关于析构函数的执行在第7章举例
类的成员 属性 封装对字段的访问 一对特殊方法 get访问器 set访问器 读写控制
属性示例 //程序清单P6_3.cs: using System; namespace P6_3 { public class PropertySample public static void Main() Console.WriteLine("请输入联系人姓名:"); Contact c1 = new Contact(Console.ReadLine()); Console.WriteLine("请输入联系人生日(yyyy-mm-dd):"); c1.Birthday = DateTime.Parse(Console.ReadLine()); //DateTime.TryParse(Console.ReadLine(), out p1.Birthday); Console.WriteLine("{0}的年龄为: {1}", c1.Name, c1.Age); }
属性示例(续) public class Contact { //字段 private string m_name; private DateTime m_birthday; //属性 public string Name get return m_name; } public DateTime Birthday return m_birthday; set m_birthday = value;
属性示例(续) public int Age { get return DateTime.Now.Year - m_birthday.Year; } //构造函数 public Contact(string name) m_name = name;