黑马程序员_面向对象的三个基本特征

面向对象的理解

面向对象和面向过程都是一种编程思想,面向对象是相对于面向过程而言的,面向过程是面向对象的基础。

面向过程:完成任务由具备相应功能的函数,强调的是行为过程,完成这项任务是怎样做的!

面向对象:完成任务由具备相应功能的实例对象,强调的是具备相应功能的实例对象,完成这项任务的结果是什么!

面向对象编程的重要的组成要素:类和对象

类:类是用来描述事物的,类是抽象的概念,仅仅是模板,类不占内存

对象:对象是这类事物存在的个体,描述对象就是描述对象的行为和特征,对象占内存。

属性的作用:属性是为了保护与之相对应的字段的,保证对字段的读取和赋值符合要求,允许外部访问的变量一般要声明为属性,属性的本质是方法。

一、封装:将一段实现指定功能的代码包装起来,方便使用。

  封装是面向对象的特征之一,是对象和类概念的主要特性。封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。面向对象计算始于这个基本概念,即现实世界可以被描绘成一系列完全自治、封装的对象,这些对象通过一个受保护的接口访问其他对象。一旦定义了一个对象的特性,则有必要决定这些特性的可见性,即哪些特性对外部世界是可见的,哪些特性用于表示内部状态。在这个阶段定义对象的接口。通常,应禁止直接访问一个对象的实际表示,而应通过操作接口访问对象,这称为信息隐藏。事实上,信息隐藏是用户对封装性的认识,封装则为信息隐藏提供支持。封装保证了模块具有较好的独立性,使得程序维护修改较为容易。对应用程序的修改仅限于类的内部,因而可以将应用程序修改带来的影响减少到最低限度。

二、继承:子类可以调用父类方法,实现了资源复用。

  继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类继承了原始类的特性,新类称为原始类的派生类(子类),而原始类称为新类的基类(父类)。派生类可以从它的基类那里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。这也体现了大自然中一般与特殊的关系。继承性很好的解决了软件的可重用性问题。比如说,所有的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 }
多态USB例子
原文地址:https://www.cnblogs.com/dlwcg/p/3611451.html