Has-a与is-a的区别
Has-a全称class A has a kind of class B.意为A类是B类的一部分。Has-a主要考私有继承和组合来实现,通过私有继承的方式继承的话,基类的接口不会被派生类继承,组合同样也是这样。
Is-a全称class A is a kind of class B.意为A类是B类的一种具体情况。Is-a主要是通过公有继承实现的,最大化的保留了基类的外部接口,而且在基类的基础上进行了更加具体化的补充和发展。
Has-a和is-a在第一代继承时基类在派生类中的功能没太大差异,但是在基类在派生类中的外部接口就出现了明显的差异,在has-a中派生类完全失去了基类的全部外部接口,而is-a中派生类则最大化的保留继承了基类的外部接口。
形象化举例:
Has-a:
基类是哺乳动物的主要特征,派生类是人的主要特征。哺乳动物作为人的主体特征,它的外部接口全部被人继承。
Is-a:
基类是机翼,派生类是飞机。飞机机翼作为飞机的一部分,承载了飞机的一部分基本技能,飞机机翼的外部接口没有在飞机所保留,全部纳入private权限之下。而且我们要的是整架飞机的外部接口,机翼的外部接口是用于组装飞机的,并不是和外界进行数据沟通的。