叩开抽象的大门(1)——抽象类、接口
面向对象的世界里,抽象是一个非常重要的概念。
这里我假定你已经知道什么是封装、继承、多态,却对什么什么是抽象还十分地迷茫。
现在让我们一起来来叩开抽象的大门。
抽象,就是抽出事物本质的东西。
一、认识它
要理解面向对象里的抽象,首先需要知道两个概念:抽象类、接口。
你肯定知道抽象类可以有属性、方法,抽象类里方法可以只是一个声明。
也知道接口就是一组方法的声明。
也知道抽象类和接口都不能直接 类名/接口名 实例 = new 类名/接口名(); 来实例化。
举个例子来说明:
蜂鸟的翅膀和翠鸟的翅膀都是鸟类的翅膀。翅膀组合成鸟。
鸟类的翅膀不实现fly()方法,而是抽取出了子类的共同属性和方法。抽象类实现了子类的实现方式相同方法,而只把实现方式不同的方法声明为抽象方法,交由子类分别去实现。这样一来,同样的代码便不会出现两次了。
这图体现了蜂鸟的翅膀和翠鸟的翅膀都实现了飞的接口,而鸟依赖飞的接口。
接口只是告诉子类,你应该有fly()的方法,fly()方法的参数和返回值应该是void。
二、区分它
螺旋桨实现飞的接口,合情合理。但螺旋桨继承鸟类翅膀???脑袋进水了有木有!!!
为什么鸟要用螺旋桨飞?因为我的鸟只想要fly(),而有时候鸟想飞地更高、更久、更省力,此时鸟类的翅膀都不能满足需求,给它螺旋桨吧。
这里我瞎扯一下。抽象派的艺术家,抽取出的是自己所想要情感,因此我们看到他的绘画作品,便能直接感受到艺术家的心情。因为艺术家略掉了所有次要的信息,因此他表达出来的效果便十分强烈。作为程序员,略掉次要的信息,意味着写出来的代码可读性更好,维护起来也更容易。
三、发疯的类图
抽象类和接口的出现使得软件设计更加多样,通过使用不同的抽象方式,可以设计出各种各样的系统。
如果你要的仅仅是一只蜂鸟。后面的设计明显小题大做了。。。