关于我下个你上网上一搜答案绝对是一大堆,但是基本无非都是在摆理论 。刚好本人既写过面向过程(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();
}
}
}
怎么样,现在对面向对象有一个大概的了解了吧 。相比面向过程,面向对象的思想在编写大型项目时代码更容易维护、更易懂、代码重用率更高 。但相对的牺牲的就是运行的效率了 。