递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 451|回复: 8

[视窗] 面向对象:类和对象的关系,是这样理解吗

[复制链接]

172

主题

1045

帖子

4314

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
4314
QQ
发表于 2025-1-10 20:39:49 | 显示全部楼层 |阅读模式
本帖最后由 朕的 于 2025-1-10 20:46 编辑

刚开始从易语言转过度过来很难理解类和对象的关系,特别是静态概念,是这样理解吗:


一句话:类是模具,对象是用模具类生产出来的铸件使用模具类可以生产出无数个铸件对象,无数个对象中可能包含相同属性和不同属性,相同属性的可用做静态从而不用区分是哪个对象的,因为对象可能有不同的属性所以就是创建对象的意义,知道谁是谁的属性。



<strong><font color="Blue">全国会议活动直播拍摄、
回复

使用道具 举报

75

主题

1095

帖子

4822

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
4822
发表于 2025-1-10 20:56:55 | 显示全部楼层
本帖最后由 hcwanz 于 2025-1-10 21:02 编辑

我觉的不如不用比喻, 直接说多好.

易语言里, 写在代码里的方法, 都会在程序运行时就创建在内存中, 都可以直接使用.
所以易语言全是对象, 自然无需区分.
(大有若无啊)

火山里, 写在代码中的方法, 不一定会在程序运行时就创建,
即为有些可以立刻使用, 有些不行.
所以需要明确一个`对象`, 是`对象`的才能使用.
(当然此处的对象非常狭义, 只是不是`面向对象`的全部意味.)
回复

使用道具 举报

75

主题

1095

帖子

4822

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
4822
发表于 2025-1-10 21:11:03 | 显示全部楼层
我没完整的学过易语言(了解了一下就来火山了),
易语言没有`类/结构体`这种多类型组合的概念吗?

我感觉你说的是`类`的意义啊.


回复

使用道具 举报

4

主题

192

帖子

1593

积分

核心用户

用户组:菜鸟用户

Rank: 9Rank: 9Rank: 9

积分
1593
发表于 2025-1-10 21:24:33 | 显示全部楼层
对于我们这些小白来说,  类=累=泪
死活学不会
回复

使用道具 举报

7

主题

169

帖子

1619

积分

金牌会员

Rank: 6Rank: 6

积分
1619
发表于 2025-1-10 22:00:03 | 显示全部楼层
我觉得应该是思路上的区别,本质上你用火山写类的区别和易语言差别并不是太大

就拿你的模具来解释,易语言你写的时候会用一堆函数去实现你想要的功能,所以程序写出来基本上是死的

而C++的话,写的时候是一个个类,也就是你把数据丢到哪个类去用,用完的数据再丢到另一个类里面继续用,因此你会发现这就是一个非常明显的模块化,随着程序复杂性的增加,你不需要像易那样回头大改,而是只需要继续增加新的模块,所以你用火山要转变思维,虽然也转变不了多少,很多功能都是不支持的
回复

使用道具 举报

447

主题

1万

帖子

4万

积分

超级版主

Rank: 8Rank: 8

积分
41501
发表于 2025-1-10 22:32:10 | 显示全部楼层
易语言也有类的。
安卓无障碍实战课:点击查看
交流群:641526939
回复

使用道具 举报

35

主题

429

帖子

1559

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
1559
发表于 2025-1-11 15:14:28 | 显示全部楼层
泪泪哭哭
回复

使用道具 举报

38

主题

473

帖子

1648

积分

金牌会员

Rank: 6Rank: 6

积分
1648
QQ
发表于 2025-1-11 17:09:34 | 显示全部楼层
高手们还是拿个 实际的功能代码 能阐述类 对像 这个问题吧,
习惯了易语言,面向过程了,而这个面向对像据说很强大 但确实不好理解,反而觉的麻烦的,
但是开发小软件,易语言够了,但大型软件 可能是需要类 对象 这样的编程思路的。
Q 75520266
回复

使用道具 举报

0

主题

8

帖子

113

积分

注册会员

Rank: 2

积分
113
发表于 5 天前 | 显示全部楼层
# 面相对象三大特性,封装,继承,多态。

1. 封装,只提供对外暴露的方法,用户无需关心内部实现
    - 例如我们定义 "人类",直接定义 性别/年龄/身高/体重 等属性,我们可以在内部提供对应的读写方法,并且可以在类内部判断输入值是否合法。
    - 我们还可以提供一个 "读方法",方法名为 "读BMI值",用户调用该方法时我们通过 性别/身高/体重 等数值实时计算,用户无需关心该值是如何来的。
    - 我们将代码封装在类内部,调用方只能使用我们提供的公开成员,防止关键数据被调用方随意篡改,例如上方的 BMI。


2. 继承,子类继承父类的属性和方法,子类可以重写父类的方法
    - 当我们有许多类似的类有很多重复的代码,我们可以将重复的代码抽取出来设计一个父类,然后通过继承这个父类获得父类属性和方法。
    - 例如我们定义 "学生","老师",它们身上都有 "性别","年龄","身高","体重" 等属性,但如果我们都给它们编写这些属性就太重复了,且后面要增删属性时需要修改所有相关的类很不方便,所以我们可以合理提取这些重复属性到一个新的类 "人类" 上面,然后让 "学生","老师" 继承该类即可。
    - 为了体现重写,我们假设 "人类" 身上有个叫 "社会活动" 的方法,"人类" 对该方法的实现为 "输出 保持呼吸",而在 "学生/老师" 上面,显然这个已经无法满足它们的需求,所以 "学生/老师" 可以重写 "社会活动" 方法,实现自己的需求,例如 "学生" 重写后 "输出 学习","老师" 重写后 "输出 教课",并且可以在重写的方法内调用 `父对象.社会活动()` 来调用重写之前的父方法。
    - 最终调用 "学生/老师" 的 "社会活动" 时会得到输出 "保持呼吸 学习" 和 "保持呼吸 教课",达到了复用代码/重写增强的目的。


3. 多态,父类引用指向子类对象,父类调用子类的方法
    - 使用上方 "人类" 的例子,假设我有一个方法,需要接受一个对象参数,然后调用 `参数.社会互动()`,如果没有多态,我们可能需要定义多个方法,接收各种不同的参数类型,而且后续如果增加更多支持 `社会互动()` 的类时,我们可能还需要回头增加对应类型参数的方法,而且这些方法的代码都是相同的:`参数.社会互动()`
    - 而多态解决了这个问题,我们只需要将方法的参数类型定义为 "人类", 即可以接受任何 "人类" 的子类对象,例如 "学生","老师","学生" 和 "老师" 都是 "人类" 的子类,所以 "学生" 和 "老师" 都可以作为参数传递给 `社会互动()` 方法,并且 "学生" 和 "老师" 都可以重写 `社会互动()` 方法,实现自己的需求,后续增加新的支持 `社会互动()` 的类时,只要它继承了 "人类",即可作为参数调用这个方法,无需改动其他任何代码(符合开闭原则,只新增不修改)。
    - 例如 ODBC/JDBC 等操作数据库的类库,对外只提供了一套接口对数据库进行操作,而具体的实现是由数据库厂商提供的,用户只需要调用接口方法即可,而不需要关心实现细节,我们传入 mysql 对象时,操作的是 mysql,传入 pg 对象时,操作的是 pg数据库,但它们的代码是完全一样的,当我们有更换数据库的需求时,只需要替换传入的 数据库对象。
    - 上述例子中 "学生/老师" 就是 "人类" 的多种形态,"MySQL/Pg" 等就是数据库的多种形态,多态指的就是方法参数可以接收 `指定类型` 以及 `指定类型的子类`


- 关于类静态属性:
    - 静态成员表示类的属性,这个属性是属于类的,而不是属于某个具体的对象。
    - 我们可以给 "人类" 增加两个静态属性 "总诞生人数" 和 "剩余人数",我们在 "人类" 的构造函数/析构函数中给 对两个静态属性进行 自增自减,这样我们就可以通过 `人类.总诞生人数``人类.剩余人数` 来访问这两个静态属性。
    - 虽然我们可以通过 `实例对象.静态属性` 来访问,但因为静态属性是属于类的,我们不需要创建具体对象,即可以直接通过 `类名.属性名` 来访问,因为静态属性是属于类的,只有一份,所以即使使用多个不同的实例对象来操作,操作的也是同一个数据。


- 关于接口(Interface):
    - 首先,火山不支持,理解上面几点概念就差不多了
    - 在实际开发中,我们通常是面向接口编程,写的程序是模块化的,模块之间是松耦合的,例如上面多态提到的 ODBC/JDBC。
    - 接口就是定义一组方法,只有方法的签名定义,最终这个方法需要由具体的类来实现,最终我们的代码可以只依赖接口,不依赖具体实现类,从而实现松耦合。
    - 接口对比类的区别是,接口只有方法定义而没有具体代码,需要子类去实现。且一个类可以实现多个接口(多种形态),但只能继承一个类。








回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|递归火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2025-1-20 20:54 , Processed in 0.094721 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表