精华内容
下载资源
问答
  • 类和类/对象和对象之间的三大关系

    千次阅读 2018-10-13 18:12:37
    线段上有两个点 - has-a - 关联关系 整体不可分割的,叫做强关联/聚合 eg:人有手,车有引擎 人使用了房子 - use-a - 使用,依赖关系 学生是人 - is-a - 继承关系 继承 - 从已经有的创建新的过程 提供继承...

    线段上有两个点 - has-a - 关联关系 整体不可分割的,叫做强关联/聚合 eg:人有手,车有引擎

    人使用了房子 - use-a - 使用,依赖关系

    学生是人 - is-a - 继承关系

    继承 - 从已经有的类创建新类的过程
    提供继承信息的称为父类(超类/基类)
    得到继承信息的称为子类(派生类/衍生类)
    通过继承我们可以将子类中的重复代码抽取到父类中
    子类通过继承并复用这些代码来减少重复代码的编写
    将来如果要维护子类的公共代码只需要在父类中进行操作即可
    
    class Person(object):
    
        def __init__(self,name,age):
            self._name = name 
            self._age = age
    
        @property  # getter - 属性访问器
        def name(self):
            return self._name
    
        @property
        def age(self):
            return self._age
    
        @age.setter  # setter - 属性修改器
        def age(self,age):
            self._age = age
    
        def watch_av(self):
            print('%s正在看片' % self._name)
    
    class Student(Person):
    
        def __init__(self, name, age):
            super().__init__(name,age)  # 从父类Person继承属性name,age
            self._course = course
    
        @property
        def course(self):
            return self._course
    
        @course.setter
        def study(self,course):
            return '%s正在学习%s' % (self._name, course)
    
        # 方法重写(override) - 覆盖/置换/重写  
        # 子类在继承父类方法之后,对方法进行了重新实现
        # 当我们给子类对象发送watch_av消息时执行的是子类重写过的方法
        def watch_av(self):
            print('学生正在跟苍老师学习技术')
    
    def main():
        stu1 = Student('李牧',40)
        stu2 = Student('钟岳',17)
        stu1.study('HTML网页设计')
        stu2.watch_av()
    
    if __name__ == '__main__':
        main()
    

    Python没有从语言层面支持抽象类的概念,我们可以通过abc模块来制造抽象类的效果

    在定义类的时候通过指定metaclass=ABCMeta可以将类声明为抽象类

    抽象类是不能创建对象的,抽象类存在的意义是专门给其他类继承

    abc模块中还有一个包装器abstractmethod,通过这个包装器可以将方法包装为抽象方法,必须要求子类进行重写

    from abc import ABCMeta,abstramethod
    
    class Employee(object,metaclass=ABCMeta):
        '''员工'''
    
        def __init__(self,name):
            '''初始化方法'''
            self._name = name
    
        @property
        def name(self):
            return self._name
    
        @abstractemethod
        def get_salary(self):
            '''获得月薪...'''
            pass
    
    class Manager(Employee):
    
        def get_salary(self):
            return 15000.00
    
    class Programmer(Employee):
    
        def __init__(self,name):
            super().__init__(name)
            self._working_hour = 0
    
        @property
        def working_hour(self):
            return self._working_hour
    
        @working_hour.setter
        def working_hour(self,working_hour):
            self._working_hour = working_hour if working_hour > 0 else 0
    
        def get_salary(self):
            return 150.0 * self._working_hour
    
    class Salesman(Employee):
    
        def __init__(self,name):
            super().__init__(name)
            self._sales = sales
    
        @property
        def sales(self):
            return self._sales
    
        @sales.setter
        def sales(self,sales):
            self._sales = sales if sales > 0 else 0
    
        def get_salary(self):
            return 1200.0 + self._sales * 0.05
    
    def main():
        emps = [
            Manager('猴子'), Programmer('罗刹'),
            Manager('龙女'), Salesman('狐狸'),
            Salesman('牛魔'), Programmer('神将'),
            Programmer('和尚')
        ]
        for emp in emps:
            # isinstance判定一个对象是不是指定的类型
            if isinstance(emp, Programmer):
                emp.working_hour = int(input('请输入%s本月工作时间:' % emp.name))
            elif isinstance(emp,Salesman):
                emp.sales = float(input('请输入%s本月销售额:' % emp.name))
            # 同样是接收get_salary这个消息,但是不同的员工表现出了不同的行为
            # 因为三个子类都重写了get_salary方法,所以这个方法会表现出多态行为
            print('%s本月工资为: ¥%.2f元' % (emp.name,emp.get_salary()))
    
    
    if __name__ == '__main__':
        main()
    
    展开全文
  • 对象之间的6种关联关系

    千次阅读 2019-12-06 16:50:59
    六种关系 ...聚合,实线空心菱形箭头,描述一种整体部分的关系,强调部分可脱离整体而存在,例如,学校老师,老师可脱离学校而存在。 组合,实线实心菱形箭头,描述一种整体部分的关系,强调...

    六种关系

    1. 从弱到强,依次为依赖,关联,聚合,组合,泛化,实现,抽象程度越来越高。

    具体描述

    1. 依赖,虚线箭头,描述一种临时关系,例如,人与交通工具,人依赖交通工具。
    2. 关联,实线箭头,描述一种比较固定的关系,例如,人与住址。
    3. 聚合,实线空心菱形箭头,描述一种整体和部分的关系,强调部分可脱离整体而存在,例如,学校和老师,老师可脱离学校而存在。
    4. 组合,实线实心菱形箭头,描述一种整体和部分的关系,强调部分不可脱离整体而存在,例如,头与眼睛,眼睛不可与头分割。
    5. 泛化,实线空心三角箭头,描述一种特殊与一般的关系,例如,人类与科学家,科学家是人类的一种。
    6. 实现,虚线空心三角箭头,描述一种具有关系,例如,飞翔之于鸟,鸟具有飞翔能力。
    展开全文
  • 在学习面向对象设计对象关系时,依赖、关联、聚合组合这四种关系之间区别比较容易混淆。特别是后三种,仅仅是在语义上有所区别,所谓语义就是指上下文环境、特定情景等。他们在编程语言中的体现却是基本相同的,...

    在学习面向对象设计对象关系时,依赖、关联、聚合和组合这四种关系之间区别比较容易混淆。特别是后三种,仅仅是在语义上有所区别,所谓语义就是指上下文环境、特定情景等。他们在编程语言中的体现却是基本相同的,但是基本相同并不等于完全相同,这一点在我的前一篇博文《设计模式中类的关系》中已经有所提及,下面就来详细的论述一下在Java中如何准确的体现依赖、关联、聚合和组合。

    首先看一看书上对这四种关系的定义:

    • 依赖(Dependency)关系是类与类之间的联接。依赖关系表示一个类依赖于另一个类的定义。例如,一个人(Person)可以买车(car)和房子(House),Person类依赖于Car类和House类的定义,因为Person类引用了Car和House。与关联不同的是,Person类里并没有Car和House类型的属性,Car和House的实例是以参量的方式传入到buy()方法中去的。一般而言,依赖关系在Java语言中体现为局域变量、方法的形参,或者对静态方法的调用。
    • 关联(Association)关系是类与类之间的联接,它使一个类知道另一个类的属性和方法。关联可以是双向的,也可以是单向的。在Java语言中,关联关系一般使用成员变量来实现。
    •  聚合(Aggregation) 关系是关联关系的一种,是强的关联关系。聚合是整体和个体之间的关系。例如,汽车类与引擎类、轮胎类,以及其它的零件类之间的关系便整体和个体的关系。与关联关系一样,聚合关系也是通过实例变量实现的。但是关联关系所涉及的两个类是处在同一层次上的,而在聚合关系中,两个类是处在不平等层次上的,一个代表整体,另一个代表部分。
    •  组合(Composition) 关系是关联关系的一种,是比聚合关系强的关系。它要求普通的聚合关系中代表整体的对象负责代表部分对象的生命周期,组合关系是不能共享的。代表整体的对象需要负责保持部分对象和存活,在一些情况下将负责代表部分的对象湮灭掉。代表整体的对象可以将代表部分的对象传递给另一个对象,由后者负责此对象的生命周期。换言之,代表部分的对象在每一个时刻只能与一个对象发生组合关系,由后者排他地负责生命周期。部分和整体的生命周期一样。

    ——摘自《Java面向对象编程》,作者:孙卫琴

           以上关系的耦合度依次增强(关于耦合度的概念将在以后具体讨论,这里可以暂时理解为当一个类发生变更时,对其他类造成的影响程度,影响越小则耦合度越弱,影响越大耦合度越强)。由定义我们已经知道,依赖关系实际上是一种比较弱的关联,聚合是一种比较强的关联,而组合则是一种更强的关联,所以笼统的来区分的话,实际上这四种关系、都是关联关系。

            依赖关系比较好区分,它是耦合度最弱的一种,在java中表现为局域变量、方法的形参,或者对静态方法的调用,如下面的例子:Driver类依赖于Car类,Driver的三个方法分别演示了依赖关系的三种不同形式。

    [java]  view plain  copy
    1. class Car {  
    2.     public static void run(){  
    3.         System.out.println("汽车在奔跑");  
    4.     }  
    5. }  
    6.   
    7. class Driver {  
    8.     //使用形参方式发生依赖关系  
    9.     public void drive1(Car car){  
    10.         car.run();  
    11.     }  
    12.     //使用局部变量发生依赖关系  
    13.     public void drive2(){  
    14.         Car car = new Car();  
    15.         car.run();  
    16.     }  
    17.     //使用静态变量发生依赖关系  
    18.     public void drive3(){  
    19.         Car.run();  
    20.     }  
    21. }  

            关联关系在java中一般使用成员变量来实现,有时也用方法形参的形式实现。依然使用Driver和Car的例子,使用方法参数形式可以表示依赖关系,也可以表示关联关系,毕竟我们无法在程序中太准确的表达语义。在本例中,使用成员变量表达这个意思:车是我自己的车,我“拥有”这个车。使用方法参数表达:车不是我的,我只是个司机,别人给我什么车我就开什么车,我使用这个车。

    [java]  view plain  copy
    1. class Driver {  
    2.     //使用成员变量形式实现关联  
    3.     Car mycar;  
    4.     public void drive(){  
    5.         mycar.run();  
    6.     }  
    7.     ...  
    8.     //使用方法参数形式实现关联  
    9.     public void drive(Car car){  
    10.         car.run();  
    11.     }  
    12. }  

            聚合关系是是一种比较强的关联关系,java中一般使用成员变量形式实现。对象之间存在着整体与部分的关系。例如上例中

    [java]  view plain  copy
    1. class Driver {  
    2.     //使用成员变量形式实现聚合关系  
    3.     Car mycar;  
    4.     public void drive(){  
    5.         mycar.run();  
    6.     }  
    7. }  


            假如给上面代码赋予如下语义:车是一辆私家车,是司机财产的一部分。则相同的代码即表示聚合关系了。聚合关系一般使用setter方法给成员变量赋值。

    假如赋予如下语义:车是司机的必须有的财产,要想成为一个司机必须要先有辆车,车要是没了,司机也不想活了。而且司机要是不干司机了,这个车就砸了,别人谁也别想用。那就表示组合关系了。一般来说,为了表示组合关系,常常会使用构造方法来达到初始化的目的,例如上例中,加上一个以Car为参数的构造方法

    [java]  view plain  copy
    1. public Driver(Car car){  
    2.     mycar = car;  
    3. }  


            所以,关联、聚合、组合只能配合语义,结合上下文才能够判断出来,而只给出一段代码让我们判断是关联,聚合,还是组合关系,则是无法判断的。

    展开全文
  • UML对象和类之间的相互关系总结

    千次阅读 2009-03-16 11:35:00
    UML中描述对象和类之间相互关系的方式包括:依赖(Dependency)关联(Association)聚合(Aggregation)组合(Composition)泛化(Generalization)实现(Realization)等。 依赖 (Dependency):元素A的变化会...

    UML中描述对象和类之间相互关系的方式包括:

    依赖(Dependency)

    关联(Association)

    聚合(Aggregation)

    组合(Composition)

    泛化(Generalization)

    实现(Realization)

    等。

     

    依赖 (Dependency):元素A的变化会影响元素B,但反之不成立,那么B和A的关系是依赖关系,B依赖A;类属关系和实现关系在语义上讲也是依赖关系,但由于其有更特殊的用途,所以被单独描述。UML中用带箭头的虚线表示Dependency关系箭头指向被依赖元素

     

    关联(Association):元素间的结构化关系,是一种弱关系,被关联的元素间通常可以被独立的考虑。UML中用实线表示Association关系箭头指向被依赖元素

     

    聚合(Aggregation):关联关系的一种特例,表示部分和整体的关系。UML中用带空心菱形头的实线表示Aggregation关系菱形头指向整体

    聚合是关联的一种形式,代表两个类之间的整体/局部关系。聚合暗示着整体在概念上处于比局部更高的一个级别,而关联暗示两个类在概念上位于相同的级别。关联和聚合的区别纯粹是概念上的,而且严格反映在语义上。聚合还暗示着实例图中不存在回路。换言之,只能是一种单向关系。

     

    组 合(Composition):组合是聚合关系的变种,表示元素间更强的组合关系。如果是组合关系,如果整体被破坏则个体一定会被破坏,而聚合的个体则可 能是被多个整体所共享的,不一定会随着某个整体的破坏而被破坏。UML中用带实心菱形头的实线表示Composition关系菱形头指向整体

     

    泛化(Generalization):通常所说的继承关系,UML中用带空心箭头的实线线表示Generalization关系箭头指向一般个体

     

    实现(Realize):元素A定义一个约定,元素B实现这个约定,则B和A的关系是Realize,B realize A。这个关系最常用于接口。UML中用空心箭头和虚线表示Realize关系箭头指向定义约定的元素

     

     

     

    其中依赖(Dependency)的关系最弱,而关联(Association),聚合 (Aggregation),组合(Composition)表示的关系依次增强。换言之关联,聚合,组合都是依赖关系的一种,聚合是表明对象之间的整体 与部分关系的关联,而组合是表明整体与部分之间有相同生命周期关系的聚合。

    而关联与依赖的关系用一句话概括下来就是,依赖描述了对象之间的调用关系,而关联描述了对象之间的结构关系。

    展开全文
  • 类和类之间关系

    万次阅读 多人点赞 2018-06-28 17:21:10
    类和类之间的6种关系一、UMLa) Unified Modeling Language (UML)又称统一建模语言或标准建模语言b) 它是一个支持模型化软件系统开发的图形化语言,为软件开发的所有阶段提供模型化可视化支持c) 它不仅统一了...
  • Java 对象关系(依赖、关联、聚合组合)

    千次阅读 多人点赞 2018-09-11 23:53:41
    面向对象设计对象关系:依赖、关联、聚合组合,四种关系容易混淆。特别后三种,只是在语义上有所区别,所谓语义就是指上下文环境、特定情景等。 1、依赖(Dependency) 依赖关系,是类之间的联接。依赖关系...
  • 对象关联关系

    千次阅读 2018-11-09 22:15:49
    对象之间最弱的一种关联方式,是临时性的关联。代码中一般指由局部变量、函数参数、返回值建立的对于其他对象的调用关系。 class A{ public B method(C c,D d){ E e = new E(); ... B b = new B(); .....
  • 面向对象类之间关系详细解析

    千次阅读 2018-04-12 21:31:52
    在软件系统中,不是孤立存在的,...1.关联关系 1)双向关联 2)单向关联 3 )自关联 :的属性对象类型为自身 4)多重关联:表示一个对象和另一个对象连接的个数 5)聚合关系:表示一个整体与部分 6...
  • 面向对象:对象之间关系

    千次阅读 2019-01-23 00:52:02
    对象就是一个真实世界中的实体,对象与实体是一一对应关系的,意思就是现实世界的每一个实体都是一个对象,所以对象是一个具体的概念。 对象的一个集合,对象的实例。 而对象的产生在Java中是使用new来...
  • 类和类之间的依赖、关联、聚合、组合关系

    万次阅读 多人点赞 2018-04-23 20:01:43
    一、继承关系 继承指的是一个(称为子类、子接口)继承另外的一个(称为父类、父接口)的功能,并可以增加它自己的新功能的能力。在Java中继承关系通过关键字extends明确标识,在设计时一般没有争议性。在UML...
  • [UML] 类图之间的关系 | 1.关联关系

    千次阅读 2020-07-01 11:56:59
    在UML类图中,用实线连接有关联关系对象所对应的,在使用Java、C++C#等编程语言实现关联关系时,通常将一个对象作为另一个的成员变量 在使用类图表示关联关系时可以在关联线上标注角色名 1.1 双向关联 ...
  • UML图中类之间关系:依赖,泛化,关联,聚合,组合,实现 与类图 1) (Class)封装了数据行为,是面向对象的重要组成部分,它是具有相同属性、操作、关系对象集合的总称。 2) 在系统中,每个具有一定的职责,...
  • 面向对象--类之间的几种关系

    千次阅读 2015-01-16 13:33:42
    一、继承关系 继承指的是一个(称为子类、子接口)继承另外的一个(称为父类、父接口)的功能,并可以增加它自己的新功能的能力。在Java中继承关系通过关键字extends明确标识,在设计时一般没有争议性。在UML...
  • 类之间关系--泛化,关联,依赖,实现

    千次阅读 热门讨论 2014-10-26 14:52:19
    对象是面向对象的基础,类之间关系是面向对象不可或缺的一部分。下面将从关系定义,UML中的符号表示,代码实现三方面介绍类之间关系。 1、泛化(Generalization):也成为继承关系。指一个...
  • UML中描述对象和类之间相互关系的方式包括:依赖(Dependency),关联(Association),聚合(Aggregation),组合(Composition),泛化(Generalization),实现(Realization)等。 依赖(Dependency):元素A的...
  • 面向对象类之间关系

    千次阅读 2018-08-04 20:03:59
    ​ 类图中表示关联关系时可以在关联关系线上标注角色名,一般使用一个表示两个之间的关系的动词或则名称表示角色名(有时候名称为实例对象名),关系的两端代表不同的角色名,可以在两端写名,也可以不写。...
  • UML类和类之间关系详解

    千次阅读 2020-04-15 21:27:25
    五分钟读懂UML类图 12-10 10:411097浏览举报 T字号 平时阅读一些远吗分析文章...在UML类图中,使用包含类名、属性(field) 方法(method) 且带有分割线的矩形来表示,比如下图表示一个Employee,它包含name,ag...
  • java中的面向对象和类之间关系

    千次阅读 2016-05-10 09:02:56
     c、分析类之间关系  (合适的方法应该出现在合适的中)  2、举例:模板-实物  a、白板笔  b、员工(年龄、姓名、性别、工作岗位)  (显示姓名,年龄,修改姓名,修改年龄,变更工作岗位)  (区分...
  • 对象之间的四种关系

    万次阅读 2016-04-07 19:44:37
    对象之间的4种关系  a、依赖关系(Dependency)  所谓依赖就是某个对象的功能依赖于另外的某个对象,而被依赖的对象只是作为一种工具在使用,而并不持有对它的引用  举例:一个人自创生就需要不停的呼吸...
  • 类图是使用频率最高的UML图之一,主要用于描述系统中所包含的以及它们之间的相互关系,帮助开发人员理解系统,它是系统分析设计阶段的重要产物,也是系统编码测试的重要模型依据。 间的关系包括关联、继承、...
  • Java类之间关联关系

    万次阅读 多人点赞 2012-05-19 20:43:07
    Java类之间关联关系 UML类图中的关系分为四种:泛化、依赖、关联、实现;关联关系又可以细化为聚合组合。 一、泛化(Generalization) 泛化是父类子类之间的关系,子类继承父类的所有结构行为。在子类中...
  • UML中类之间的几种关系   (2012-04-15 17:35:29) http://blog.sina.com.cn/s/blog_59ca2c2a01012ido.html 转载▼ 标签:  ...类关系 ...类之间可能存在以下几种关系关联(association)、依赖(depe
  • Java面试题大全(2020版)

    万次阅读 多人点赞 2019-11-26 11:59:06
    发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了这套Java面试题大全,...JDK:Java Development Kit 的简称,java 开发工具包,提供了 java 的开发环境运行环境。 JRE:Java Runtime Environ...
  • 三、类之间关系(Relationship) 1、单向关联 2、双向关联 3、自身关联 4、多维关联(N-ary Association) 5、泛化(Generalization) 6、依赖(Dependency) 7、聚合(Aggregation) 8、组合(Composite) 四、...
  • 首先类之间关系从宏观上可以分为:继承(泛化)、依赖、关联,而其中关联又有两种特例:聚合组合,不过在 UML2.X 中聚合组合视为成一种关系了。 泛化 • 泛化关系(Generalization)也就是继承关系,用于描述...
  • 面向对象----浅述对象之间关系

    千次阅读 2017-12-07 17:31:03
    对象之间关系:依赖(需要某种服务),关联(对象间有某种对应关系),聚合,组合,继承... 依赖: 对象之间最弱的一种关联方式,是临时性的关联。代码中一般指由局部变量、函数参数、返回值建立的对于其他...
  • 类之间关系和耦合度

    千次阅读 2020-06-30 21:19:46
    根据类之间的耦合度从弱到强排列,UML 中的类图有以下几种关系:依赖关系、关联关系、聚合关系、组合关系、泛化关系和实现关系。其中泛化和实现的耦合度相等,它们是最强的。 依赖关系 依赖(Dependency)关系是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 257,456
精华内容 102,982
关键字:

对象和类之间存在着关联关系