C++对象间的关系

目录

27.1对象之间的关系

27.2依赖关系

27.3关联关系

27.4聚合关系

27.5组合关系


27.1对象之间的关系

在一个系统中,一个对象可能与不同的对象相关,以下是不同的关系:依赖(Dependency) (使用一个)、关联(Association) (使用一个)、聚合(Aggregation) (有一个)、组合(Composition )(有一个"用...来实现")、继承(Inheritance) (是一个)、类模板(Class template)

27.2依赖关系

依赖关系是用一个带箭头的虚线表示的;他描述一个对象在运行期间会用到另一个对象的关系与关联关系不同的是,它是一种临时性的关系,通常在运行期间产生,并且随着运行时的变化; 依赖关系也可能发生变化;显然,依赖也有方向,单向依赖,双向依赖,我们总是应该保持单向依赖,杜绝双向依赖的产生。

注意:在最终代码中,依赖关系体现为类构造方法及类方法的传入参数,箭头的指向为调用关系;依赖关系处理临时知道对方外,还是”使用”对方的方法和属性。

 例子:

class Book
{};
class Notebook_computer 
{};
class Desktop_computer
{
private:
    string cup;
	int Memory;
	int ssdist;
};
class student
{
public:
    void Study_Programming(Notebook_computer& cp); //学习编程
    void study_Programming(Desktop_computer& cp);
    void study_Programming(Book& bk); 
    void study_Programming();
}
int main()
{
    Student s1;
    Book cpp;
    Notebook_Computer nc;
    Desktop_Computer pc;
    s1.Study_Programming(cpp);//ok
    s1.Study_Programming(nc);//ok
    s1.Study_Programming(pc);//ok
    return 0;
}

s1学生既可以通过Book类对象cpp进行学习,也可以通过另外两个类对象进行学习,还可以不依赖对象进行学习;在成员方法参数中存在该类,并不是必须有这个对象才能进行下去,而是可有可无的,这就是依赖关系。

27.3关联关系

关联关系是用一条直线表示的,它描述不同类的对象之间的结构关系,它是一种静态关系,通常与运行状态无关,一般由常识等因素决定的;它一般用来定义对象之间静态的、天然的结构; 所以,关联关系是一种“强关联”的关系;

比如,教师和课程之间就是一种关联关系;

学生和学校就是一种关联关系关联关系默认不强调方向,表示对象间相互知道;如果特别强调方向,如下图,表示Tearcher知道Course,但 Course 不知道Tearcher; 注:在最终代码中,关联对象通常是以成员属性 (对象)或引用的形式实现。

 例子:

class Book
{
private:
    string _name;
public:
    Book(string na):_name(na)
    {
        cout<<"name:"<<this<<endl;
    }
    void Show()const
    {
        cout<<this<<endl;
        cout<<_name<<endl;
    }
};
class Student1
{
private:
    Book* pbook;//弱关联
public:
    Student1():pbook(nullptr){}
    Student1(Book* p):pbook(p){}
    void SetBook1(Book* p)
    {
        pbook = p;
    }
    void Study1()
    {
        if (pbook != nullptr)
		{
			pbook->Show();
		}
		else
		{
			cout << "not book!!!" << endl;
		}
    }
    ~Student1(){}
};
class Student2
{
private:
    Book& book;//强关联
public:
    Student2(Book& bk):book(bk){}
    void SetBook2(Book& bk)
    {
        book = bk;
    }
    void Study2()const
    {
        book.Show();
    }
    ~Student2(){}
};
int main()
{
    Book cpp("cpp"), java("java");
	Student1 studp(&cpp);//ok
	studp.Study1();
	studp.SetBook1(&java);//ok
	studp.Study1();

	Student2 stud(cpp);//ok
	stud.Study2();
	stud.SetBook(java);//ok
	stud.Study2();
	return 0;
}

结果:

 

在类中以指针或者引用将其他类设计为成员属性,这时就说该类与其他类是关联关系。但以指针和引用是有区别的;

以指针作为成员属性时,是一种弱关联,指针在构造时指向cpp对象后,可以在对其进行改变,让其重新指向java对象;而以引用作为成员属性时,是一种强关联,(引用的特点是定义即初始化,没有空引用,没有引用的引用)引用在构造时指向cpp对象后,就再无法进行改变,而SetBook()函数中只是将java对book进行赋值

27.4聚合关系

(有一个,有整体和部分的关系)聚合关系用一条带空心菱形箭头的直线表示,如下图表示Point聚合到Circle上,或者说Circle由Point组成. 聚合关系用于表示实体对象之间的关系,表示整体由部分构成的语义;例如一个部门由多个员工组成与组合关系不同的是,整体和部分不是强依赖(生存期控制),即使整体不存在了,部分仍然存在;例如,部门撤销了,人员不会消失,他们依然存在;

 

关联与聚合的区别:在概念上,它们都是对象实例间的一种静态关系,都是在类的抽象层次上的定义,并且最终都可以通过对象的属性来体现。但它们差别是,聚合关系所涉及的两个类型的对象,在现实世界中的含义有明显的has -a(有一个)的语义,能够区分那个是整体,那个是部分,而关联所涉及的对象之间没有这种语义,即分不出整体和部分的关系。用...来组成。

27.5组合关系

(有一个,"用...来实现”,用...来构成”,有整体和部分的关系)组合关系用一条带实心菱形箭头直线表示,如下图表示Body和Soul组成People,或者People由Body和 Soul组成与聚合关系一样,组合关系同样表示整体由部分构成的语义;比如公司由多个部门组成;但组合关系是一种强依赖的特殊聚合关系,如果整体不存在了,则部分也不存在了;例如,公司不存在了,部门也将不存在了;

 

聚合与组合的区别:相比于聚合,组合是一种耦合度更强的关联关系。存在组合关系的类表示“整体-部分”的关联关系,"整体"负责“部分”的生命周期,他们之间是共生共死的;并且“部分”单独存在时没有任何意义。

即聚合关系不存在生存期控制,整体不存在时,部分依然有意义;而组合关系

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值