作者zzss2003 (brotherD)
看板C_and_CPP
标题[问题] Abstract data type与物件的关系?
时间Mon Mar 12 11:54:29 2018
嗨,鲁蛇我看到维基百科对於ADT的描述有点不清楚,故上来发文请教。
网址:
https://en.wikipedia.org/wiki/Abstract_data_type
In computer science, an abstract data type (ADT) is a mathematical model for
data types, where a data type is defined by its behavior (semantics) from the
point of view of a user of the data, specifically in terms of possible
values, possible operations on data of this type, and the behavior of these
operations.
我有查过stack overflow关於ADT的定义,读完之後,想法是:
我定义一个全新的资料型别,这个资料型别的"概念"是可以放很多相同型别变数的容器,
而我要求在C语言中(我只会C,所以拿C当例子),创造这个变数的方式(semantic)是:
容器里的资料型别 容器名字[容量];,for example:
int array[3];
同时我定义中括号里面的数字为下标,下标可以代表每个在容器里面的资料的index,同时
也定义如何对这个容器做operation(把容器当作参数丢到function里、利用指标操作容器)
那麽,这整个东西叫一个ADT,实作出来的叫CDT(concrete data type),也就是array。
我会问这个问题是因为我不太清楚ADT与物件之间的关系。
我现在想要用C实作一个battery的物件,那我要先定义这个battery要用什麽data type表
示、会有什麽行为,那我感觉ADT非常相似於物件,但又感觉有一些差别。
拿个实际我卡住的例子:
typedef enum{
BATTERY_UNLOAD,
BATTERY_LOADED,
BATTERY_HEALTHY,
BATTERY_BROKEN,
}BATTERY_STATES;
typedef struct{
uint16_t voltage;
uint16_t current;
uint16_t temperature;
BATTERY_STATES battery_state;
}BATTERY_OBJECT;
在这个例子中,我定义了battery的语意、也定义了battery的operation(可以被指标处理)
,那这不就等於ADT吗?
如果我今天改成用queue放资料:
typedef struct{
queueNode QueueNode;
BATTERY_STATES battery_state;
}BATTERY_OBJECT;
那麽,物件就不等於ADT了,因为ADT被包含在物件里。
那请问,我这篇文章在观念上哪边有错误吗?
如果没有错误,那麽,物件与ADT之间的关系是?
谢谢各位前辈指教。
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 60.248.26.157
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1520826872.A.20D.html
1F:推 Ommm5566: ADT其实就是封装概念一种 使用者不需要知道实际行为 03/12 12:50
2F:→ Ommm5566: 第一段最後一行就说了 一般的DS是大家知道实作细节的 03/12 12:51
3F:→ Ommm5566: 比如queue, list, heap 一喊出来你就会知道他的底层是 03/12 12:51
4F:→ Hazukashiine: 我们一般称 stack queue 等为 ADT 大概就这样而已 03/12 12:52
5F:→ Ommm5566: sequential, reference, tree 03/12 12:52
6F:→ Hazukashiine: 把ADT 跟物件混在一起讨论也是蛮神奇的 03/12 12:52
7F:→ Ommm5566: 而ADT使用者不需要知道底层实作 只要结果符合说明 03/12 12:52
8F:→ Ommm5566: 再更具体一点就是list你会预期有next操作相反的heap却无 03/12 12:54
9F:→ Ommm5566: 这时候就没有封装了 03/12 12:54
10F:→ Ommm5566: 所以你的code跟ADT完全没关系 03/12 12:55
11F:→ Ommm5566: 你贴的网页下面就有C code阿 03/12 12:57
12F:→ Ommm5566: 简单说今天stack可能是用list或用array实作 03/12 12:57
13F:→ Ommm5566: 使用者不用管 只要这个介面保证stack给我push和pop正确 03/12 12:58
14F:→ Ommm5566: 当然用stack/quere/list/heap不是很好的例子 03/12 12:59
15F:→ Ommm5566: 常见的实作就那几种 很容易让第一次看到的人无法理解 03/12 13:01
16F:→ Ommm5566: 封装的概念 03/12 13:01
17F:→ flowwinds: ADT定义中写用此资料型别会如何被使用及操作来定义它, 03/12 13:07
18F:→ flowwinds: 而不着重此资料型别实际上用什麽方式(阵列或串列)实现 03/12 13:09
19F:→ MOONRAKER: 学一学资料结构,不要用看的。 03/12 14:11
20F:→ MOONRAKER: 还有你既然有看到wiki 那就看一下底下Examples里面有 03/12 14:13
21F:→ MOONRAKER: 哪一些东东 基本上你就记得要复杂到那样才会叫ADT 03/12 14:14
不好意思,顺便借问一下,Horowitz的fundamentals of data structures第一版(1981)与
第二版(2007)的内容会差很多吗?我手头只有第一版
※ 编辑: zzss2003 (60.248.26.157), 03/12/2018 15:39:39
22F:→ MOONRAKER: 非常多 我在图书馆借来看过 03/12 15:53
谢啦~那我去买个第二版来读好了
※ 编辑: zzss2003 (60.248.26.157), 03/12/2018 16:23:54