面向对象的四大基本特性

面向对象的核心概念就是封装、抽象、继承、多态这四大基本特性,在这里先解释一下它们的定义:

封装:是一种隐藏信息的特性。找到变化并且把它封装起来,你就可以在不影响其它部分的情况下修改或扩展被封装的变化部分,这是所有设计模式的基础,就是封装变化,因此封装的作用,就解决了程序的可扩展性。 

抽象:在使用面向对象的方法设计一个软件系统时,首先就要区分出现实世界中的事物所述的类型,分析它们拥有哪些性质与功能,再将它们抽象为在计算机虚拟世界中才有意义的实体——类,在程序运行时,由类创建出对象,用对象之间的相互合作关系来模拟真实世界中事物的相互关联。

继承:子类继承父类,可以继承父类的方法及属性,实现了多态以及代码的重用,因此也解决了系统的重用性和扩展性,但是继承破坏了封装,因为他是对子类开放的,修改父类会导致所有子类的改变,因此继承一定程度上又破坏了系统的可扩展性,所以继承需要慎用,只有明确的IS-A关系才能使用,同时继承在在程序开发过程中重构得到的,而不是程序设计之初就使用继承,很多面向对象开发者滥用继承,结果造成后期的代码解决不了需求的变化了。因此优先使用组合,而不是继承,是面向对象开发中一个重要的经验。 

多态:接口的多种不同的实现方式即为多态。接口是对行为的抽象,刚才在封装提到,找到变化部分并封装起来,但是封装起来后,怎么适应接下来的变化?这正是接口的作用,接口的主要目的是为不相关的类提供通用的处理服务,我们可以想象一下。比如鸟会飞,但是超人也会飞,通过飞这个接口,我们可以让鸟和超人,都实现这个接口,这就实现了系统的可维护性,可扩展性。 

 

只说这些概念性的东西,可能会很难理解,所以给大家再用实例解释一下它们各自的含义:

1、封装可以包起外界不必需要知道的东西,只向外界展露可供展示的东西。封装的类=数据+算法

如:定义一个Name对象的方法——(先写上private string _Name,右键,重构,封装)封装具有属性,可以用来操作,字段不具有属性,无法get set

 1 private string _Name;//命名规则:下划线+大写字母开头
 2 
 3 public string Name
 4 {
 5       get//取值
 6       { return _Name; }
 7 
 8       set//赋值
 9       { _Name = value; }
10 }

在get,set中可以写上很多种算法,最终让它的返回值返回给Name类,从而实现隐藏信息的效果。

2、抽象即写好一个类,用来在编程中调用。

如:根据年龄、性别来判断是否超重的函数(类)

 1         public int cetizhong(string sex,decimal shengao,decimal tizhong)
 2         {
 3             if (sex == "")
 4             {
 5                 decimal biaozhun = shengao - 100;
 6                 if (tizhong > biaozhun + 3)
 7                 {
 8                     return 1;//
 9                 }
10                 else if (tizhong < biaozhun - 3)
11                 {
12                     return 2;//
13                 }
14                 else
15                 {
16                     return 0;//标准
17                 }
18                 
19             }
20             else if (sex == "")
21             {
22                 decimal biaozhun1 = shengao - 100;
23                 if (tizhong > biaozhun1 + 3)
24                 {
25                     return 1;//
26                 }
27                 else if (tizhong < biaozhun1 - 3)
28                 {
29                     return 2;//
30                 }
31                 else
32                 {
33                     return 0;//标准
34                 }
35             }
36             else
37                 return 3;
38             
39         }

再在主函数中调用:

 1             Ren r = new Ren();
 2             Console.WriteLine("请输入姓名:");
 3             r.name = Console.ReadLine();
 4             Console.WriteLine("请输入姓别:");
 5             r.sex = Console.ReadLine();
 6             Console.WriteLine("请输入身高:");
 7             r.shengao = decimal.Parse(Console.ReadLine());
 8             Console.WriteLine("请输入体重:");
 9             r.tizhong = decimal.Parse(Console.ReadLine());
10 
11             int fanhui = r.cetizhong(r.sex, r.shengao, r.tizhong);
12             if(fanhui ==0)
13                 Console.WriteLine("标准");
14             else if(fanhui == 1)
15                 Console.WriteLine("偏重");
16             else 
17                 Console.WriteLine("偏瘦");

new的过程也就是由类创建出新对象的过程,也就是函数的一个扩展。

 

继承——相当于父子关系,食品可以分为水果、蔬菜等等,而水果又可以分为苹果、西瓜等等,它们都继承了上一级的特点。

多态——水果有很多种,分为苹果、西瓜等,这便是它的多种形态。

这些特性还有很多扩展的概念,将会在下面的几章提到。