面向对象的四大基本特性
面向对象的核心概念就是封装、抽象、继承、多态这四大基本特性,在这里先解释一下它们的定义:
封装:是一种隐藏信息的特性。找到变化并且把它封装起来,你就可以在不影响其它部分的情况下修改或扩展被封装的变化部分,这是所有设计模式的基础,就是封装变化,因此封装的作用,就解决了程序的可扩展性。
抽象:在使用面向对象的方法设计一个软件系统时,首先就要区分出现实世界中的事物所述的类型,分析它们拥有哪些性质与功能,再将它们抽象为在计算机虚拟世界中才有意义的实体——类,在程序运行时,由类创建出对象,用对象之间的相互合作关系来模拟真实世界中事物的相互关联。
继承:子类继承父类,可以继承父类的方法及属性,实现了多态以及代码的重用,因此也解决了系统的重用性和扩展性,但是继承破坏了封装,因为他是对子类开放的,修改父类会导致所有子类的改变,因此继承一定程度上又破坏了系统的可扩展性,所以继承需要慎用,只有明确的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的过程也就是由类创建出新对象的过程,也就是函数的一个扩展。
继承——相当于父子关系,食品可以分为水果、蔬菜等等,而水果又可以分为苹果、西瓜等等,它们都继承了上一级的特点。
多态——水果有很多种,分为苹果、西瓜等,这便是它的多种形态。
这些特性还有很多扩展的概念,将会在下面的几章提到。