080、类与类之间的关系

类与类之间主要存在以下几种关系:

  1. 继承(Inheritance):
    • 继承是面向对象编程的一个基本特征,它允许我们定义一个类(子类或派生类)来继承另一个类(父类或基类)的属性和方法。子类可以拥有父类的所有属性和方法,也可以添加新的属性和方法或重写(Override)继承的方法。继承是一种”is-a“的关系
  2. 关联(Association):
    • 关联是一种has-a”关系。描述了两个或多个类之间的结构关系,表示一个类的对象与另一个类的对象有联系。关联可以是单向的,也可以是双向的。关联可以是简单的,也可以包含一些属性或操作,这些属性或操作描述了对象之间的链接信息。
      所以关联可以分为普通关联或强关联。其中强关联又有聚合和组合两种:
      1. 组合(Composition):
        • 组合是一种“has-a”关系,表示一个类是另一个类的部分或成员。在组合关系中,一个类的对象包含另一个类的对象作为其属性。这种关系通常用于表示整体与部分的关系。
      2. 聚合(Aggregation):
        • 聚合是组合的一种特殊形式,它也是一种“has-a”关系,但聚合关系中的整体与部分之间具有更弱的耦合性。在聚合关系中,部分对象可以独立于整体对象存在,即整体对象的生命周期不会影响到部分对象的生命周期。
  3. 依赖(Dependency):
    • 依赖关系是一种弱关联,它表示一个类依赖于另一个类的定义。在依赖关系中,一个类(依赖者)的变化可能会影响到另一个类(被依赖者),但这种影响是局部的,通常不会导致被依赖者的变化。依赖关系通常通过局部变量、方法参数或返回类型来体现,通俗的说就是一个类的对象作为另外一个类的方法的参数或者返回值。
  4. 接口实现(Interface Implementation):
    • 接口实现不是传统意义上的类与类之间的关系,但它描述了类与接口之间的关系。一个类可以实现一个或多个接口,这意味着该类将提供接口中声明的所有方法的实现。接口是一种特殊的类,它只包含方法的声明而不包含方法的实现。

下面是一个简单的展示了类与类之间关系的示例:

class Animal:  """动物基类"""def __init__(self, name):  self.name = name  def make_sound(self):  raise NotImplementedError("子类必须实现抽象方法")  # 
class Dog(Animal): """狗"""def __init__(self, name):  super().__init__(name)  def make_sound(self):  return f"{self.name} 叫汪汪!"  class Collar:  """项圈"""def __init__(self, color):  self.color = color  def describe(self):  return f"这是个{self.color} 项圈."  class House:  """房子"""def __init__(self, address):  self.address = address  self.residents = []  # 在这里可以有其它类对象,比如Dog对象。这就是聚合,因为Dog是House的一部分,但Dog可以独立于House存在  def add_resident(self, resident):  self.residents.append(resident)  def describe_residents(self):  for resident in self.residents:  if isinstance(resident, Dog):  print(resident.make_sound())  class Trainer: """训练"""def __init__(self):  self.dog = None  # 依赖关系,Trainer依赖于Dog来执行训练  def train(self, dog):  self.dog = dog  print(f"训练 {dog.name}...")  # 使用my_dog = Dog("Buddy")  
my_collar = Collar("Blue")  
my_house = House("狗街123号")  
my_trainer = Trainer()  # 组合:将Dog添加到House中  
my_house.add_resident(my_dog)  
my_house.describe_residents()  # 输出 Buddy的叫声  # 依赖:Trainer训练Dog ,my_dog作为my_trainer类中train方法的参数 
my_trainer.train(my_dog)  # 输出 训练 Buddy...  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/42594.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

孟德尔随机化与痛风3

写在前面 检索检索,刚好发现一篇分区还挺高,但结果内容看上去还挺熟悉的文章,特记录一下。 文章 Exploring the mechanism underlying hyperuricemia using comprehensive research on multi-omics Sci Rep IF:3.8中科院分区:2区 综合性期…

刷题——重建二叉树

重建二叉树_牛客题霸_牛客网 TreeNode* reConstructBinaryTree(vector<int>& preOrder, vector<int>& vinOrder) {// write code hereint n preOrder.size();int m vinOrder.size();if(n 0 || m 0) return NULL;TreeNode* root new TreeNode(preOrde…

【排序算法】—— 快速排序

快速排序的原理是交换排序&#xff0c;其中qsort函数用的排序原理就是快速排序&#xff0c;它是一种效率较高的不稳定函数&#xff0c;时间复杂度为O(N*longN)&#xff0c;接下来就来学习一下快速排序。 一、快速排序思路 1.整体思路 以升序排序为例&#xff1a; (1)、首先随…

web缓存代理服务器

一、web缓存代理 web代理的工作机制 代理服务器是一个位于客户端和原始&#xff08;资源&#xff09;服务器之间的服务器&#xff0c;为了从原始服务器取得内容&#xff0c;客户端向代理服务器发送一个请求&#xff0c;并指定目标原始服务器&#xff0c;然后代理服务器向原始…

启动外部EXE参数

QString rootDir1 QApplication::applicationDirPath(); QString filePathExe1 QString(“%1/run/xxx.exe”).arg(rootDir1); QString fileConfigPath1 QString(“%1/run/”).arg(rootDir1); std::string stdStr filePathExe1.toStdString(); LPCSTR lpcStr stdStr.c_str(…

xxxxxxx.jar中没有主清单属性

写了一个小的springboot demo&#xff0c;构建时由于没加构建的maven插件,导致使用java -jar命令运行时报错xxxxxxx.jar中没有主清单属性。 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boo…

使用Spring Boot和HBase实现大数据存储

使用Spring Boot和HBase实现大数据存储 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 一、引言 随着大数据技术的发展&#xff0c;处理和存储海量数据成为许…

2-27 基于matlab的一种混凝土骨料三维随机投放模型

基于matlab的一种混凝土骨料三维随机投放模型&#xff0c;为混凝土细观力学研究提供一种快捷的三维建模源代码。可设置骨料数量&#xff0c;边界距离、骨料大小等参数。程序已调通&#xff0c;可直接运行。 2-27 matlab 混凝土骨料三维随机投放模型 - 小红书 (xiaohongshu.com)…

CDNOW_master.txt数据分析实战

一、数据详情 该数据集是常见的销售数据集&#xff0c;数据展示的是美国1997后的商品销售数据。包含四个字段&#xff0c;分别是用户id,购买时间&#xff0c;销售量&#xff0c;与销售金额。 二、数据读取与数据清洗 导入必要的包 \s代表的许多空格作为分割&#xff0c;names重…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【明文导入密钥(C/C++)】

明文导入密钥(C/C) 以明文导入ECC密钥为例。具体的场景介绍及支持的算法规格 在CMake脚本中链接相关动态库 target_link_libraries(entry PUBLIC libhuks_ndk.z.so)开发步骤 指定密钥别名keyAlias。 密钥别名的最大长度为64字节。 封装密钥属性集和密钥材料。通过[OH_Huks_I…

【JavaScript脚本宇宙】提升用户体验:探索 JavaScript 库中的浏览器特性支持检测

深入探讨JavaScript库&#xff1a;功能、配置与应用场景 前言 在现代的Web开发中&#xff0c;JavaScript库扮演着至关重要的角色&#xff0c;帮助开发人员简化代码、提高效率、实现更好的用户体验。本文将探讨几个常用的JavaScript库&#xff0c;包括模块加载库、数据绑定库和…

Word文档中公式的常用操作

一、参考资料 二、常用操作 插入公式 Alt 多行公式 Shift Enter 多行公式对齐 WORD Tips: 多行公式编辑及对齐 word自带公式等号对齐&#xff08;可任意符号处对齐&#xff09; 多行公式按照 为基准对齐。 拖动鼠标选中整个公式点击右键&#xff0c;选择【对齐点(…

计算机系统简述

目标 计算机世界并非如此神秘。相反&#xff0c;计算机是非常“确定”的一个系统&#xff0c;即在任何时候&#xff0c;在相同的方法、相同的状态下&#xff08;当然还包括相同的起始条件&#xff09;&#xff0c;同样的问题必然获得相同的结果。其实&#xff0c;计算机并不是…

数据库的学习(4)

一、题目 1、创建数据表qrade: CREATE TABLE grade(id INT NOT NULL,sex CHAR(1),firstname VARCHAR(20)NOT NULL,lastname VARCHAR(20)NOT NULL,english FLOAT,math FLOAT,chinese FLOAT ); 2、向数据表grade中插入几条数据: (3,mAllenwiiliam,88.0,92.0 95.0), (4,m,George&…

【数据结构与算法】快速排序双指针法

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法》 期待您的关注 ​

【js基础巩固】深入理解作用域与作用域链

作用域链 先看一段代码&#xff0c;下面代码输出的结果是什么&#xff1f; function bar() {console.log(myName) } function foo() {var myName "极客邦"bar() } var myName "极客时间" foo()当执行到 console.log(myName) 这句代码的时候&#xff0c…

树形结构数据库存储表转换

有个树形的菜单, 当初设计表时将数据存储为 level0, level1,leve2,level3..., 表名menus_month 即0层级下子层级1,孙层级2 但是带来一个问题, 如何查询这个树形结构,变得非常复杂 以下是对数据表进行关系转换, 生成两张表, menus和 menus_relastionships 1.建菜单表及关系表…

nullptr和NULL

nullptr 既不是整型类型&#xff0c;也不是指针类型&#xff0c;nullptr 的类型是 std::nullptr_t&#xff08;空指针类型&#xff09;&#xff0c;能转换成任意的指针类型。 NULL是被定义为0的常量&#xff0c;当遇到函数重载时&#xff0c;就会出现问题。避免歧义 函数重载…

如何在Spring Boot中实现OAuth2.0和OpenID Connect

如何在Spring Boot中实现OAuth2.0和OpenID Connect 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 一、OAuth2.0和OpenID Connect简介 OAuth2.0和OpenID Con…

数据结构--二叉树和堆

目录 1.基本概念 2.树的遍历方法 3.满二叉树&&完全二叉树 4.逻辑结构&&物理结构 5.推理公式 6.二叉树应用--堆 7.简单实现堆 1.基本概念 &#xff08;1&#xff09;这个里面的概念还是比较多的&#xff0c;但是大部分我们只需要了解即可&#xff0c;因为…