面向对象基本特征的来历

  这只是我看DDD书中一句话产生的联想,我其实不知道来历是什么样的,所以大家不要当真,如果觉得有道理,别拿我当标题党,我就知足了。

  一般初入行的面向对象程序员面试的时候难免会遇到面向对象的三个基本特征之类的问题,答案自然是:封装,继承,多态。

  怎么来的呢,以前没细想过这事,不过今天看书的时候突然就因为一句话开始走神,就走到这上面来了:

  一,封装。既然是面向对象,自然就要有对象,对象自然包含了对象的属性和对象的动作,例如

public class Person
 {
     public string Name { get; set; }
 
     public int Age { get; set; }
 
     public int Sex { get; set; }
 
     public void Walk()
     {
         //...
     }
 }

于是,人这个对象的动作和属性就都在这个类里面了,于是“封装”就出现了,就这么出现了。。。

  二,继承。一个软件系统不可能只有一个人用,比如OA,那是公司有多少人,几乎就会有多少人登陆,这么多人登陆,权限肯定会各有不同,再比如,警察会维持治安,学生会学习,但是警察和学生都是人,都用姓名,年龄,性别,都能走路,每个都写一遍太累,怎么办呢,继承就来了。

public class Student : Person
 {
     public string Study()
     {
         return "学习";
     }
 }
 
public class Police : Person
 {
     public string Patrol()
     {
         return "维持治安";
     }
 }

  所以我就一直说,写重复的代码就是种耻辱,当然特定情况下需要妥协的除外。

  再说说接口的实现,人可以走路,人可以写字,人可以说话等灯等灯(人。。。可以关机),那这么多可以做的事都放Person里,咱做程序也不一定都需要啊,这时候就使用接口了,可以走路的就实现走路,可以关机的。。。就没有然后了

interface IWalk
{
    void Walk(); 
}

public class Person:IWalk
 {
     public string Name { get; set; }
 
     public int Age { get; set; }
 
     public int Sex { get; set; }
 
     public void Walk()
     {
         //...
     }
 }

  这时候基本上太多的问题解决了,不管是人多,还是多动症(多动症是骗人的,其实没这回事儿)。

  现在咱往细了再看看,比如说走路,你得抬脚,抬脚你得用力登地,先抬脚尖,可能是大脚趾还是什么什么的,弯腿啊,肌肉啊,筋啊,话说再加上血管流动血液,怎么供氧之后,大家还记得我说什么么,对,就是走路,真这么写,像我从一句话走神走这么远的人还能不能走的回来,真心是有压力,那怎么办呢,咱刚说完的封装,咱就接着封装吧。

  

public class WalkForward: IWalk
 {
     public void Walk()
     {
         //往前迈步
     }
 }
public class Person
 {
//大家理解个意思就好了,别挑实现方法的毛病哈
   IWalk walk = new WalkForward();
public string Name { get; set; } public int Age { get; set; } public int Sex { get; set; } public void Walk() { walk.Walk(); } }

  这个时候太大的问题,也就是走路太费劲影响到person可读性的问题也解决了,然后就是走路方法的问题。

  三,多态。走路本来就这么多事了,关键它还分向前走,向后走,向斜前方走。。。斜前方1度角,1.1度角。。。走。。。走个路还真难啊,好在有封装,好在有了上面接口实现的情况,好在还有继承,就像Student可以做所有Person能做的事一样,向前走也是走,也就是说向后走也是走---似乎没有什么因果关系,不过这不重要,重要的是可以看出来,我还可以这么用:

public class WalkBackwards: IWalk
 {
     public void Walk()
     {
         //往后。。。迈步?
     }
 }
IWalk walk = new WalkBackwards();

  这就好办多了,我想往前走,就把走的接口实现为向前走的,想后就后,走神到这,突然就感觉到这标题有些不合适了,不过咱作为标题党一向不在意这个,老有人劝我改标题,说看了那个标题,一般都不愿意看内容了,估计以后要注意了,不过这次是走神,是从这个出发点开始走的,用它也算贴切吧。

 

posted @ 2014-05-08 23:05  draculav  阅读(1600)  评论(12编辑  收藏  举报