面向对象的理解
面向对象和面向过程都是一种编程思想,面向对象是相对于面向过程而言的,面向过程是面向对象的基础。
面向过程:完成任务由具备相应功能的函数,强调的是行为过程,完成这项任务是怎样做的!
面向对象:完成任务由具备相应功能的实例对象,强调的是具备相应功能的实例对象,完成这项任务的结果是什么!
面向对象编程的重要的组成要素:类和对象
类:类是用来描述事物的,类是抽象的概念,仅仅是模板,类不占内存
对象:对象是这类事物存在的个体,描述对象就是描述对象的行为和特征,对象占内存。
属性的作用:属性是为了保护与之相对应的字段的,保证对字段的读取和赋值符合要求,允许外部访问的变量一般要声明为属性,属性的本质是方法。
一、封装:将一段实现指定功能的代码包装起来,方便使用。
封装是面向对象的特征之一,是对象和类概念的主要特性。封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。一旦定义了一个对象的特性,则有必要决定这些特性的可见性,即哪些特性对外部世界是可见的,哪些特性用于表示内部状态。在这个阶段定义对象的接口。通常,应禁止直接访问一个对象的实际表示,而应通过操作接口访问对象,这称为信息隐藏。事实上,信息隐藏是用户对封装性的认识,封装则为信息隐藏提供支持。封装保证了模块具有较好的独立性,使得程序维护修改较为容易。对应用程序的修改仅限于类的内部,因而可以将应用程序修改带来的影响减少到最低限度。
二、继承:子类可以调用父类方法,实现了资源复用。
继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。这也体现了大自然中一般与特殊的关系。继承性很好的解决了软件的可重用性问题。比如说,所有的Windows应用程序都有一个窗口,它们可以看作都是从一个窗口类派生出来的。但是有的应用程序用于文字处理,有的应用程序用于绘图,这是由于派生出了不同的子类,各个子类添加了不同的特性。

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace 继承 7 { 8 #region 人类,父类。 9 class Person 10 { 11 private string name; 12 13 protected string Name 14 { 15 get { return name; } 16 set { name = value; } 17 } 18 19 private char sex; 20 21 protected char Sex 22 { 23 get { return sex; } 24 set { sex = value; } 25 } 26 27 private int age; 28 29 protected int Age 30 { 31 get { return age; } 32 set { age = value; } 33 } 34 35 public Person(string name, char sex, int age) 36 { 37 this.Name = name; 38 this.Sex = sex; 39 this.Age = age; 40 } 41 } 42 #endregion 43 44 #region 老师类,继承(派生)于人类,子类。 45 class Teacher : Person 46 { 47 private int year; 48 49 public int Year 50 { 51 get { return year; } 52 set { year = value; } 53 } 54 55 private int salary; 56 57 public int Salary 58 { 59 get { return salary; } 60 set { salary = value; } 61 } 62 63 public Teacher(string name, char sex, int age, int year, int salary) 64 : base(name, sex, age) 65 { 66 this.Year = year; 67 this.Salary = salary; 68 } 69 70 public void SayHello() 71 { 72 Console.WriteLine("我是{0},当了{1}年老师,我的月薪是{2}。", Name, Year, Salary); 73 } 74 } 75 #endregion 76 77 #region 学生类,继承(派生)于人类,子类。 78 class Student : Person 79 { 80 private string hobby; 81 82 protected string Hobby 83 { 84 get { return hobby; } 85 set { hobby = value; } 86 } 87 88 private int classID; 89 90 protected int ClassID 91 { 92 get { return classID; } 93 set { classID = value; } 94 } 95 96 public Student(string name, char sex, int age, string hobby, int classID) 97 : base(name, sex, age) 98 { 99 this.Hobby = hobby; 100 this.ClassID = classID; 101 } 102 103 public void SayHello() 104 { 105 Console.WriteLine("我是{0},我是{1}孩,今年{2}岁,爱好是{3},在{4}班。", Name, Sex, Age, Hobby, ClassID); 106 } 107 } 108 #endregion 109 110 class Program 111 { 112 static void Main(string[] args) 113 { 114 Student s = new Student("张三", '男', 18, "踢足球", 3); 115 s.SayHello(); 116 Teacher t = new Teacher("王老师", '女', 30, 5, 8000); 117 t.SayHello(); 118 Console.ReadKey(true); 119 } 120 } 121 //输出结果: 122 //我是张三,我是男孩,今年18岁,爱好是踢足球,在3班。 123 //我是王老师,当了5年老师,我的月薪是8000。 124 }
三、多态:同一种表现形式实现不同的方法。
多态性是指允许不同类的对象对同一消息作出响应。比如同样的加法,把两个时间加在一起和把两个整数加在一起肯定完全不同。又比如,同样的选择编辑-粘贴操作,在字处理程序和绘图程序中有不同的效果。多态性包括参数化多态性和包含多态性。多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace 隐式隐藏父类方法 7 { 8 class Father 9 { 10 public void Write() 11 { 12 Console.WriteLine("In the Father."); 13 } 14 } 15 class Son : Father 16 { 17 //父类与子类方法名、参数(签名)、类型相同 18 19 //public void Write() 20 //使用new 显式隐藏基类方法 最好加上new,别人看代码的时候知道父类有一个同名方法。 21 //不使用new 隐式隐藏基类方法 22 public new void Write() 23 { 24 Console.WriteLine("In the Son."); 25 } 26 } 27 class Program 28 { 29 static void Main(string[] args) 30 { 31 Father f1 = new Father(); 32 f1.Write(); 33 34 Son s1 = new Son(); 35 s1.Write(); 36 37 Father f2 = s1; 38 f2.Write(); 39 Console.ReadKey(true); 40 } 41 //输出结果: 42 //In the Father. 43 //In the Son. 44 //In the Father. 45 } 46 }

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace 重写父类方法 7 { 8 class Father 9 { 10 public virtual void Write() 11 { 12 Console.WriteLine("In the Father."); 13 } 14 } 15 class Son : Father 16 { 17 public override void Write() 18 { 19 Console.WriteLine("In the Son."); 20 } 21 } 22 class Program 23 { 24 //new 则隐藏,over则重写, 25 //隐藏看类型,重写只顾新! 26 // ——蒋坤 27 static void Main(string[] args) 28 { 29 Father f1 = new Father(); 30 f1.Write(); 31 32 Son s1 = new Son(); 33 s1.Write(); 34 35 Father f2 = s1; 36 f2.Write(); 37 Console.ReadKey(true); 38 } 39 //输出结果: 40 //In the Father. 41 //In the Son. 42 //In the Son. 43 } 44 }

1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace 多态USB的例子 7 { 8 class Standard 9 { 10 public virtual void USB() 11 { 12 Console.WriteLine("USB标准。"); 13 } 14 } 15 class Phone : Standard 16 { 17 public override void USB() 18 { 19 Console.WriteLine("充电中"); 20 } 21 } 22 class Light : Standard 23 { 24 public override void USB() 25 { 26 Console.WriteLine("灯亮了"); 27 } 28 } 29 class Program 30 { 31 static void Main(string[] args) 32 { 33 while (true) 34 { 35 Console.WriteLine(@"请选择插入的USB设备: 36 1.手机 37 2.灯"); 38 string select = Console.ReadLine(); 39 Standard s; 40 switch (select) 41 { 42 case "1": s = new Phone(); break; 43 case "2": s = new Light(); break; 44 default: s = null; break; 45 } 46 if (s != null) 47 { 48 s.USB(); 49 } 50 else 51 { 52 Console.WriteLine("输入有误,请重新输入:"); 53 } 54 Console.ReadKey(true); 55 Console.Clear(); 56 } 57 } 58 } 59 }