注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

(转载)use-a, has-a, is-a和实现关系  

2016-12-26 11:16:46|  分类: UML+设计模式 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |


http://www.cnblogs.com/shihuajie/p/5792376.html

use-a关系
 如果类A与类B use-a 关系,则A具有类型为BB&const B&B*const B*的一个成员,或者是可以轻易以上述对象之一
 返回一个B的函数。于是A可以使用B的程序和数据。

has-a关系
 has-a 类似于 use-a,不同之处在于,A负责构建和销毁B并在它的生存期使用它。

is-a关系
 如果类A和类B use-a 关系,则B必须是A的抽象,B应当只重载基类。is-a的关系通常出现在公共派生的C++中 。

is-like-a关系(其实就是一种use-a)
  派生自基类并增加了一些新的接口...

实现关系
 如果类A与接口M是实现关系,则它实现了M所有的纯虚函数。

例:
 汽车是一种交通工具汽车  is-a  交通工具 
 汽车有一个发动机汽车  has-a  发动机 
 is-a  一般是继承关系 
 has-a  一般是组合关系

关于has-a关系,是选择包含对象还是选择私有继承的讨论
一、类包含对象
这种关系的实现无非就是一个类是另外一个类的成员而已。
Class A
{
B b;
.......
}
其实这就是一个最简单的has-a的关系的实现。
.、私有继承
c++
还有另一种实现has-a关系的途径----私有继承。使用私有继承,基类的公有成员和保护成员都将成为派生类的私有成员。这意味着基类方法将不会成为派生对象公有接口的一部分,但可以在派生类的成员函数中使用它们。
使用公有继承,基类的公有方法将成为派生类的公有方法。简而言之,派生类将继承基类的接口,这是is-a关系的一部分。使用私有继承,基类的公有方法将成为派生类的私有方法。简而言之,派生类不能继承基类的接口。正如从被包含对象中看到的,这种不完全继承是has-a关系的一部分。
因此私有继承提供的特性与包含相同:获得实现,但不获得接口。所以,私有继承也可以用来实现has-a关系。
三、使用包含还是私有继承
由于既可以使用包含,也可以使用私有继承来建立has-a关系。大多数c++程序员倾向于前者。不过私有继承所提供的特性确实比包含多。例如,假设类包含保护成员,则这样的成员在派生类中是可用的,但在继承层次机构外是不可用的。如果使用组合奖这样的类保护在另一类中,则后者将不是排成类,而是位于继承层次结构之外,因此不能访问保护成员。但通过继承的到的将是派生类,因此他能够访问保护成员。
另一种需要使用私有继承的情况是需要重新定义虚函数。派生类可以重新定义虚函数,但包含类不能。使用私有继承,重新定义的函数将只能在类中使用,而不是公有的。

 

  评论这张
 
阅读(25)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017