关于POP和OOP的解释我想网上的资料已经数不胜数了,但是基本无非都是在摆理论。刚好本人既写过面向过程(POP)的C程序也写过面向对象(OOP)的C#程序,甚至是万物皆对象的Python程序。下面本人就从自身的实际感受来给大家浅显易懂的解析一下什么是面向对象编程
其实object也可以翻译为物件,我想这个词对于初学者肯定比对象更友好。以前的pop思想其实就是过程导向,就是我想实现一个什么样的计算结果,然后用变量和函数将这个结果实现,但是这样很抽象化,初学者较难理解。但是面向对象的话将抽象的概念都给你具像化了,是以物件为主导。接下来我用一段对比代码展示可能更容易理解。
比如,我要计算两个人绕着操场跑一圈的时间。
左边是面向过程的,右边是面向对象的。其实面向对象,你可以将他的.运算符理解为我们汉语的‘的’,这样更容易让程序员理解
然后就讲到面向对象的封装,如上右图。面向对象可以将速度、距离等全部封装在一个抽象的类中,然后再通过new操作来具像化对象,而面向过程只能通过函数和变量来存储数据和运算。这样当一个工程够大的时候,面向对象的程序更容易维护,且重用性也更好
继承和多态的话是面向对象最主要的特征。其实也很好理解。还是拿上面那个例子,现在有一个小孩,他除了run这个动作外还需要加一个喝奶(drinkMilk)动作,那么小孩子也属于人这一类,我是不是可以不用再去重复的写关于Run这个动作的相关代码呢?由此,继承的概念就出来了。
namespace test0923 { class People { public double speed { get; set; } public double distance { get; set; } public double time { get; set; } public People() { } public People(double distance ,double speed) { this.distance = distance; this.speed = speed; } public double Run() { return this.distance / this.speed; } } class Children:People { public void drinkMilk() { Console.WriteLine("milk is very delicious"); } } class Progaram { static void Main(string[] args) { People xiaoMing = new People(100,10); xiaoMing.time = xiaoMing.Run(); People xiaoHua = new People(120, 12); xiaoHua.time = xiaoHua.Run(); Children baby = new Children(); baby.distance = 100; baby.speed = 2; baby.Run(); baby.drinkMilk(); } } }
那么另外一个问题又来了,小孩Run可能速度计算不能跟大人一样,可能需要自己的计算方法,那么怎么办呢?这时候,多态的概念又出来了。我们只需要给父类的即People的Run方法加上virtual,再在子类中加override就可以了
namespace test0923 { class People { public double speed { get; set; } public double distance { get; set; } public double time { get; set; } public People() { } public People(double distance ,double speed) { this.distance = distance; this.speed = speed; } public virtual double Run() { return this.distance / this.speed; } } class Children:People { public override double Run() { return this.distance/this.speed + 10; } public void drinkMilk() { Console.WriteLine("milk is very delicious"); } } class Progaram { static void Main(string[] args) { People xiaoMing = new People(100,10); xiaoMing.time = xiaoMing.Run(); People xiaoHua = new People(120, 12); xiaoHua.time = xiaoHua.Run(); Children baby = new Children(); baby.distance = 100; baby.speed = 2; baby.Run(); Console.WriteLine(baby.Run()); baby.drinkMilk(); Console.Read(); } } }
怎么样,现在对面向对象有一个大概的了解了吧。相比面向过程,面向对象的思想在编写大型项目时代码更容易维护、更易懂、代码重用率更高。但相对的牺牲的就是运行的效率了。