面向对象的实现

C语言实现面向对象之继承性 面向对象有三个最为明显的特性:继承、封装、多态性。C++、java、C#等面向对象语言在语言层次上支持OOP,而OOP本身其实并不是专门为语言设计的。虽然C语言在语言层次上不支持面向对象,但是通过C语言也是可以实现OOP的特性的。 下面就主要讲述通过C语言实现面向对象的三大特性之一:继承性。 “继承”是面向对象中的一个概念,如果一个类A继承自另一个类B,就把这个类A称之为类B的子类,而B类则是 阅读详情
 
面向对象的实现
对象之间存在的关系如下:
继承关系
继承关系使用extends关键字来实现,通常父类具有的属性子类都有,另外子类会有一些特殊的属性,继承父类之后,只需要在子类中添加新的成员变量就可以了。
这里需要关心的是这些成员变量在哪里进行初始化?对于子类新创建的成员变量肯定是在子类中就行初始化,通常情况下是在构造函数中进行初始化。对于从父类继承过来的成员变量可以在父类中初始化,也可以在子类中进行初始化,如果是在父类的构造函数中初始化,需要在子类的构造函数中调用父类的构造函数,如果调用默认的构造函数子类中可以不显式调用。
public class A
{
   private int a;
   public A()
   {
      a = 0;
   }
   public A(int a)
   {
      this.a = a;
   }
}
一个成员变量,两个构造函数,第一个赋默认值0,第二个赋给定的值。
public class B extends A
{
   private int b;
   public B()
   {
      b = 0;
   }
   public B(int a,int b)
   {
      super(a);
      this.b = b ;
   }
   public void setB(int b)
   {
      this.b = b;
   }
   public int getB()
   {
      return b;
   }
}
无参数的构造函数是默认的构造函数,实际上在初始化的时候调用了父类的无参数构造函数,第二个构造函数通过关键字super显式的调用了父类的构造函数。
一对一的关系
一对一的关系,例如A和B两个之间的关系就是一对一的关系,每个A要么对应一个B要么不对应B,而每个B要么对应一个A要么不对应。
一对一的关系使用Java来实现,需要把一个类的对象作为另外一个类的成员变量,一对一的关系可以是双向的,可以是单向的,主要根据需要来确定,如果仅仅需要根据一个对象找到另一个对象,这种关系就是单向的,如果需要根据任意一方找到另外一方,这种关系就是双向的。
假设A和B是一对一的关系,并且这种关系是单向的,只需要根据A定位B,关系的定义如下:
public class A
{
   public B b;
   public void setB(B b)/
   {
      this.b = b;
   }
   public B getB()
   {
      return b;
   }
}
如果是关联关系,b仅仅是引用,A和B的关联通常会有下面的代码:
A a1 = new A();
B b1 = new B();
a1.setB(b1);
从上面的代码可以看出,这种关联关系应该是先有对象存在,然后通过set方法来建立这种关系。
如果是包含关系,这种关系的建立通常是在创建包含对象的时候创建,也就是说通常会在构造函数中编写,也就是说当组件存在的时候,才去创建整体,当然这不是绝对的。
如果是包含关系,首先类的代码可能是这样的:
public class A
{
   public B b;
   public A(B b)
   {
      this.b = b;
   }
   public void setB(B b)
   {
      this.b = b;
   }
   public B getB()
   {
      return b;
   }
}
对象创建的代码可能是下面的样子:
B b=new B();
A a = new A(b);
把B的对象作为参数来创建A的对象。
如果是双向关系,这时候只能是关联关系,不能是包含关系,类的定义需要定义成如下的形式:
public class A
{
   B b;
   public void setB(B b)
   {
      this.b = b;
   }
   public B getB()
   {
      return b;
   }
}
 
public class B
{
   A a;
   public void setA(A a)
   {
      this.a = a;
   }
   public A getA()
   {
      return a;
   }
}
关系的建立通过下面的代码:
A a1 = new A();
B b1 = new B();
a1.setB(b1);
b1.setA(a1);
这里需要注意的是两个对象之间并不是包含关系,有人会说A是B的成员变量,B又是A的成员变量,就像鸡和蛋的问题,到底应该是先有A还是先有B。其实,可以这样去想,学过C或者C++的人都知道指针,在这里是引用,可以理解为相互引用,是对象的引用作为成员,而不是对象作为成员。
另外需要注意的是因为A作为B的成员变量,B又作为A的成员变量,在编译A的时候会用到B,同时在编译B的时候会用到A,没有办法单独编译,所以如果是这种双向关系,需要同时编译。使用:
javac *.java
关系的访问,可以根据一个对象访问与它相关联的对象,例如有A的对象a1,可以访问与a1关联的B的对象,不管是关联关系还是包含关系,访问的方法是相同的:
B temp = a1.getB();
//temp指向a1关联的对象,这样访问temp就可以了。
一对多的关系
一对多的关系需要定义集合类型的对象作为成员变量:假设A和B是一对多的关系。
public class A
{
   Collection bs;
   //设置元素的方法
   public A
   {
      bs = new ArrayList();
   }
   public void setBs(Collection c)
   {
      bs = c;
   }
   //获取元素的方法
   public Collection getBs()
   {
      return bs;
   }
   //添加元素的方法
  public void addB(B b)
   {
      if(bs==null)
         bs = new ArrayList();
      bs.add(b);
   }
   public void removeB(B b)
   {
      if(bs!=null)
      bs.remove(b);
   }
}
 
public class B
{
   A a;
   public void setA(A a)
   {
      this.a = a;
  }
   public A getA()
   {
      return a;
   }
}
如果是包含关系,通常不需要在B类中创建与A对象的关联。
关系的建立与操作:
A a1 = new A();
//创建A的对象
for(int i=1;i<5;i++)
{
   B temp = new B();
   //创建B的对象
   temp.setA(a1);
   //建立B对象与A对象之间的关系
   a1.addB(temp);
   //建立A对象与B对象之间的关系
}
关系的访问,一对多的关系的访问要稍微复杂一些。B中访问A的过程与前面的一对一情况相同,通过A访问B的代码如下:
Object[] bs = a1.getBs().toArray();
//对关联的对象进行遍历
for(int i=0;i<bs.length;i++)
{
   B temp=(B)bs[i];
   //temp指向某个元素,进行操作就可以了
   System.out.println(temp.toString());
   //这里a1所关联的所有对象的信息显示在控制台
}
多对多的关系
多对多的关系只能是关联关系,如果只考虑单向关系,与一对多的关系相同,所以这里介绍的是双向关系。
多对多的关联关系的定义如下:
public class A
{
   Collection bs;
   //设置元素的方法
   public A
   {
      bs = new ArrayList();
   }
   public void setBs(Collection c)
   {
      bs = c;
   }
   //获取元素的方法
   public Collection getBs()
  {
      return bs;
   }
   //添加元素的方法
   public void addB(B b)
   {
      if(bs==null)
         bs = new ArrayList();
      bs.add(b);
   }
   public void removeB(B b)
   {
      if(bs!=null)
      bs.remove(b);
   }
}
 
public class B
{
   Collection as;
  //设置元素的方法
   public B
   {
      as = new ArrayList();
   }
   public void setAs(Collection c)
   {
      as = c;
   }
   //获取元素的方法
   public Collection getAs()
   {
      return as;
   }
   //添加元素的方法
   public void addA(A a)
   {
      as.add(a);
   }
  public void removeA(A a)
   {
      if(as!=null)
      as.remove(a);
   }
}
关系的建立比较复杂,假设有5个A的对象,有4个B的对象,它们的关系如下:

a1
a3
a2
b1
b3
b2
 
 
 
 
 
 
 
 
 

这些关系的建立,需要下面的代码:
A a1 = new A();
A a2 = new A();
A a3 = new A();
A a4 = new A();
A a5 = new A();
//A对象的创建
 
B b1 = new B();
B b2 = new B();
B b3 = new B();
B b4 = new B();
//B对象的创建
 
a1.add(b2);
a2.add(b1); a2.add(b3);
a3.add(b1); a3.add(b2); a3.add(b3);
b1.add(a2); b1.add(a3);
b2.add(a1); b2.add(a3);
b3.add(a2); b3.add(a3);
//关系的创建
 
多对多的关系的访问与前面一对多的关系的访问基本相同,这里不再给出代码。
 
软件工程——第12章面向对象实现知识点整理 阅读详情

相关推荐

第8.1节 满足构网要求的功率器件与散热设计

摘要: 构网型变流器的功率器件选型与散热设计面临严苛要求,需综合考虑过载能力、暂态应力与可靠性。IGBT模块选型需重点评估电压/电流等级、损耗特性及结温波动,而SiC MOSFET虽具有高频低损耗优势,但面临栅极可靠性等挑战。散热设计需采用液冷等先进技术控制结温波动,并通过电热应力仿真和寿命预测实现可靠性优化。系统化选型流程需结合规范要求、工况谱分析和实测验证,为构网型变流器提供坚实的物理基础。

技术工作者 915

面向对象六种关系

对于拥有共同行为的类可以将它们抽象出一个接口。指一个类的实例A使用另外一个类的实例B。面向对象中派生类与基类之间的关系。​ 电脑和键盘、鼠标的关系。(实例对象依赖实例对象)桌子和桌面、桌腿的关系。

qq_43239467的博客 692

3DMax马克杯制作教程

01 在前视图创建一个【圆柱体】,设置参数,长度为32,高度为82;高度分段12、边数为16;如图所示。 02 点击鼠标右键,把圆柱体转换为可编辑多边形,如图所示。 03 在修改面板中,选择【多边形】层级,在视图中选择所示的面,使用缩放工具稍微缩小一点,如图所示。 04 点击【插入设置】,如图所示。 设置插入数量为2.5mm。 05 点击【挤出设置】,如图所示。 ...

youximoxingEDO的博客 3479

面向对象的6种关系:关联,聚合,组合,泛化,依赖,实现

1.单项关联Association 一个类的实例Customer使用另外一个类的实例Address,这两个对象之间为关联关系。 public class Customer { private Address address; private String name; public String getName() { return name; } public Address getAddress() { retur

wdxzuishuia的博客 7548

北京理工大学计算机学院赵曜,中国进出口银行2016年度拟接收毕业生情况公示...

《中国进出口银行2016年度拟接收毕业生情况公示》由会员分享,可在线阅读,更多相关《中国进出口银行2016年度拟接收毕业生情况公示(5页珍藏版)》请在技术文库上搜索。1、二级(三级)单位二级(三级)单位姓名姓名性别性别学历学历毕业学校毕业学校专业专业 中国进出口银行总行 机关 许凯男硕士研究生北京大学法学 中国进出口银行总行 机关 冯晨男硕士研究生北京大学教育技术学 中国进出口银行总行 机关 刘鹏...

weixin_42168902的博客 4274

【WRFDA教程第四期】雷达数据同化(Radar Data Assimilation)

雷达数据同化(Radar Data Assimilation)

WW、forever的博客 1761

【软件设计师】面向对象类图的六种关系

指一个类使用另一个类作为成员变量,如果类A使用类B作为成员变量,称类A单向关联类B,如果类B也使用类A作为成员变量,则类A与类B双向关联。关联有1:1,1:n,n:1,n:n多种关系。实现的使用:例如学生和教师,都需要知道自己在学校的信息,给学生和教师提供一个根据自己的编号查看信息的方法,可以使用一个接口定义方法,由学生和教师类实现这个方法。依赖的使用:例如学生犯错后,班级的班主任要给一个学生记过,即教师类修改学生信息,给教师类定义一个方法,使用学生类作为方法参数,对学生类的数据进行修改。

Liszter 2062

骑砍Ⅱ霸主MOD开发(16)-FaceKey&BannerKey

摘要:本文介绍了FaceKey人物模型和BannerKey旗帜模型的生成流程。FaceKey通过序列化参数生成人物模型,包括头部(脸部、嘴、睫毛、眼睛)、眉毛、头发、身体和躯干等组件,每个部分通过特定标签和骨骼绑定实现。BannerKey则通过解析参数生成旗帜模型,包括模型、贴图和颜色等元素。两种模型都采用参数化设计和XML配置文件实现模型生成与定制。

骑砍战团&霸主MOD开发 2288

第十二章: 面向对象实现

面向对象实现主要包括两项工作:把面向对象设计结果翻译成用某种程序语言书写的面向对象程序;测试并调试面向对象的程序。面向对象程序的质量基本上由面向对象设计的质量决定,但是,所采用的程序语言的特点和程序设计风格也将对程序的可靠性、可重用性及可维护性产生深远影响。

weixin_42559968的博客 517

R语言中的summarise函数和mutate函数用于计算分组占比。下面是关于这两个函数的详细介绍以及相应的源代码示例:

R语言中的summarise函数和mutate函数用于计算分组占比。

CodeByte的博客 1183

60、拓扑码:从理论到应用

本博客深入探讨了拓扑码的基本理论、构造方法及其在量子计算中的应用。重点介绍了颜色码的拓扑起源、编码量子比特的计算方法、弦算子的构造与性质、边界条件的影响、同调描述以及与统计模型相关的错误阈值分析。同时,还涵盖了拓扑码的历史发展、与其他拓扑码的关系、与凝聚态系统的联系,以及其在激发态和高维中的表现。博客展示了拓扑码在容错量子计算和未来量子信息领域的广阔前景。

o1p2q3r的博客 129

面向对象类之间主要的几种关系

关注+星标公众号,不错过精彩内容转自|嵌入式情报局嵌入式开发虽然平时C语言用的比较多,但面向对象的思维应该是每一位嵌入式软件工程师必备的知识。之前给大家分享过用C语言实现面向对象的内容,也分享过单片机用C++点灯的文章。今天就再给大家拓展一下面向对象类之间的几种关系。1、类之间的关系 类在面向对象程序设计中是一个非常重要的概念,是一系列具有相同属性和方法的对象抽象,那么弄明白类之间的主要关...

strongerHuang 1737

AUTOSAR MCAL开发及EB Tresos工具使用总结

在基于AutoSar CP架构开发MCAL时,会使用到EB tresos工具。本文主要对MCAL开发及EB tresos工具使用进行总结,仅作为自学使用,以方便后续查漏补缺。

liuxu324的博客 2630

如何实现面向对象

如何实现面向对象面向对象的定义面向对象的三大特征、面向对象的基础实现面向对象基本准则实例 面向对象的定义 对象是指具体的某一事物,在现实生活中能够看得见摸得着的事物。在面向对象程序设计中,对象指的是计算机系统中的某一个成分。 在面向对象程序设计中,对象包含两个含义,其中一个是数据,另一个是动作。对象是数据和动作的结构体。 面向对象是在对象这一层次。 面向对象的三大特征、面向对象的基础 封装、继承、多态 封装:在面向对象中,对数据和动作进行包装,其中的某些数据动作,可以是私有的,不能被外界访问,以此来实现对数

理想主义的花最终会盛开在浪漫主义的土壤里,我的热情永远不会熄灭在现实的平凡之中,我们终将上岸,阳光万里。 6662

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

面向对象的几种实现

面向对象的几种实现简单对象模型经典对象模型(C++对象模型)拓展对象模型 面向对象思想本身没有什么太值得讨论的地方,实际上就是把数据与其上的操作相绑定。这里着重讨论其底层实现,即编程语言所采用的对象模型。为简单起见,此处不使用最底层的汇编语言或机器语言,而是采用C语言描述。(原本想用C++,但考虑C++本身就是面向对象语言,为了避嫌才用了C) 在开始之前首先看一个例子: struct A { int data1 = 1; virtual void print() const {

大耳朵鱼的博客 1175

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

有函数就可以实现面向对象

无论何种语言,只要有函数,就可以实现面向对象。 -

u012632105的博客 170

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Lua如何实现面向对象

(1)封装封装是指将数据(属性)和行为(方法)封装在一个对象中,并对外部隐藏对象的具体实现细节,只提供有限的接口与外部交互。这种机制提供了对外部访问的限制和保护,使得对象的使用者无需关心对象内部的实现细节,只需关注对象提供的公共接口。封装有助于提高代码的可维护性、可重用性和安全性。(2)继承继承是指一个类(子类)可以继承另一个类(父类)的属性和方法,从而可以扩展或修改父类的功能。这种机制能够建立类之间的层次关系,使得代码可以更好地重用和扩展,同时提高了代码的可扩展性和可维护性。

m0_64251659的博客 1742

用c语言实现面向对象,用C语言实现面向对象

1、 概述C语言是一种面向过程的程序设计语言,而C++是在C语言基础上衍生来了的面向对象的语言,实际上,很多C++实现的底层是用C语言实现的,如在Visual C++中的Interface其实就是struct,查找Interface的定义,你可以发现有这样的宏定义:#ifndef Interface#define Interface struct#endifC++在语言级别上添加了很多新机制(继...

weixin_31809171的博客 1331

C语言这样来实现面向对象

关注、星标公众号,直达精彩内容来源链接:https://blog.youkuaiyun.com/onlyshi/article/details/81672279不知道有多少人去了解过语言的发展史,早期C语言的语法功能其实比较简单。随着应用需求和场景的变化,C语言的语法功能在不断升级变化。虽然我们的教材有这么一个结论:C语言是面向过程的语言,C++是面向对象的编程语言,但面向对...

李肖遥的专栏 1948

Lua之面向对象的实现

Lua本身是不支持面向对象的,但是可以利用table和元表、元方法进行面向对象的模拟! 以下是Cocos2d-lua中面向对象的实现: class function class(classname, ...) local cls = {__cname = classname} local supers = {...} for _, super in ipairs(supe...

fightsyj的博客 1332

C语言实现【面向对象】的一些方法

关注+星标公众号,不错过精彩内容编排 |strongerHuang微信公众号 | strongerHuang不知道有多少人去了解过语言的发展史,早期C语言的语法功能其实比较简单。随着应用需求和场景的变化,C语言的语法功能在不断升级变化。虽然我们的教材有这么一个结论:C语言是面向过程的语言,C++是面向对象的编程语言,但面向对象的概念是在C语言阶段就有了,而且应用到了很多地方,比如某些操作系统内核...

strongerHuang 1391

Lua语言实现面向对象

文章目录前言一、Lua中的数据类型二、_G三、元表四、面向对象1.封装2.继承3.多态总结 前言 Lua是一种轻量级的脚本语言,在unity开发中经常用来做热更新相关的解决方案,我们现在的程序开发往往都是面向对象的,而Lua中是不存在类的概念的,让我们来看一下在Lua中如何实现面向对象编程。 一、Lua中的数据类型 Lua中共有8种数据类型,简单数据类型:number、boolean、string、nil,复杂数据类型:function、userdata、thread、table。Lua中没有类的概念,

IQsuper的博客 6012

C实现面向对象

C实现面向对象编程

pythom_aaa的博客 586

C 语言实现面向对象编程

c语言面向对象编程

zhen 916
上一篇: 异常处理
下一篇: 日期及其格式化
老李-大连
博客等级 码龄20年 3206粉丝 308原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值