循序渐进 · 教学 · 本体零件(九)

接口(Interface):让不同对象"长得一样"

当你有十几种"长得差不多"的对象类型,却想用同一套逻辑去操作它们时,接口就是答案。 这一篇讲清接口是什么、它和对象类型的区别、怎么用继承与实现搭出多态

原文 Palantir Foundry · Interfaces Overview 预计阅读 11 分钟 2 个互动演示 + 6 道测验
本文来源 · Source 内容整理自 Palantir Foundry 官方文档:
https://www.palantir.com/docs/foundry/interfaces/interface-overview/
原始标题:Interfaces · Overview

一句话速览

接口(Interface):让不同对象"长得一样":当你有十几种"长得差不多"的对象类型,却想用同一套逻辑去操作它们时,接口就是答案。这一篇讲清接口是什么、它和对象类型的区别、怎么用继承与实现搭出多态。

1 接口描述"形状与能力"
在中文里,「接口(interface)」常被翻译得太技术化
2 Facility 接口
设想你有一个 Facility(设施)接口,它规定:任何实现者都要有 Facility Name(设施名称)和 Location(位…
3 接口由什么组成
一个接口由四类东西拼成,我们可以对照着理解
4 像搭积木一样复用
接口和编程语言里的接口很像,支持继承(extend)
1

一句话:接口描述"形状与能力"

An interface describes the shape of an object type and its capabilities.

在中文里,「接口(interface)」常被翻译得太技术化。你可以把它理解成一张 规格清单:一份对象类型要想"长得合规",就必须具备清单上列出的属性、链接和动作。 接口本身不存任何数据,它只定义形状(shape)能力(capabilities)

Interfaces allow for consistent modeling of and interaction with object types that share a common shape. 接口让"共享同一形状"的对象类型,能够被一致地建模与交互。

关键价值在"共享"二字:只要多种对象类型都符合同一张清单,同一段工作流就能 一次写好、处处适用——这就是后面要反复提到的多态(polymorphism)。

先记住一句对比:对象类型(object type)是具体的东西;接口是 抽象的规格。接口不装数据,它只说"想当我的实现者,你得有这些字段"。
2

一个例子:Facility 接口

同样的形状,三种完全不同的现实事物。

设想你有一个 Facility(设施)接口,它规定:任何实现者都要有 Facility Name(设施名称)和 Location(位置)这两个属性。

下面这三种对象类型,现实里毫无关系,却都"长得合规",于是都能实现(implement)这个接口:

Airport 机场
facilityName · location + 自己专属的 iataCode、跑道数等。
Manufacturing Plant 工厂
facilityName · location + 自己专属的生产线、产能等。
Maintenance Hangar 机库
facilityName · location + 自己专属的机位容量等。
多态的威力:一段"列出所有位于某城市的设施"的工作流,只要面向 Facility 接口来写,就能同时覆盖机场、工厂、机库—— 将来再加一个新的对象类型(比如 Warehouse 仓库),只要它实现了接口,工作流立刻兼容,无需重写。
3

接口由什么组成?

接口 = 属性 + 链接约束 + 动作约束 + 元数据。

一个接口由四类东西拼成,我们可以对照着理解:

组成部分说明
Interface properties 接口属性接口要求的属性。可以直接定义在接口上(推荐),也可以复用「共享属性(shared properties)」。
Link type constraints 链接类型约束规定实现接口的对象类型"应当有哪些链接",以及链接的两端长什么样。
Action type constraints 动作类型约束规定实现接口的对象类型"应当具备哪些动作能力"。原文注明这部分处于 beta 阶段。
Metadata 元数据关于接口本身的描述信息,便于在平台里检索与治理。

最重要的一点:一个接口可以被多个对象类型实现,反过来,一个对象类型也可以同时实现多个接口, 分别服务于不同的工作流。

推荐做法:接口属性优先本地定义在接口上,而不是依赖对象类型各自的属性。 这样接口的形状由接口自己掌控,实现者只是"填空"。
4

继承与实现:像搭积木一样复用

extend 继承属性,implement 声明符合规格。

接口和编程语言里的接口很像,支持继承(extend)。你可以从已有接口 扩展(extend)出一个"子接口",它自动继承父接口的全部属性, 再往上加更具体的属性。

You can extend an interface to create a child interface that inherits the properties of the original interface, then add new, more specific properties. 扩展接口可生成子接口,继承原接口属性,再追加更具体的属性。

两条规则值得记牢:

  • 对象类型实现接口(implement):声明"我符合这张规格清单",从而能被面向接口的工作流使用。
  • 层层继承:一个接口可以 extend 多个其他接口,被继承的接口还能再继承别的接口,属性会"穿透"多层传递下来。
5

接口 vs 对象类型:抽象 vs 具体

一句话区分两者最常被混淆的地方。

原文把两者的差异拆成"功能"和"外观"两层。先看成功能:

对象类型 OBJECT TYPE
具体 concrete · 由 shared / local properties 定义 schema · 背后有数据集支撑(含属性值) · 可以实例化为一个个对象
接口 INTERFACE
抽象 abstract · 由 interface properties 定义 schema · 不被数据集支撑 · 不能直接实例化,必须作为某个对象类型来实例化

外观上也有一处很贴心的区分:在平台界面里, 接口的图标用虚线边框圈起来,一眼就能和实心的对象类型分开。

常见坑:接口"不被数据集支撑、不能直接实例化"——你不能像查对象那样去查一个接口里的"数据行"。 接口是给对象类型当模板用的,真正的实例永远落在某个具体的对象类型上。

练一练:它属于哪一类?

6

权限与当前支持范围

接口还在快速演进,支持情况因应用而异。

接口的权限通过「本体角色(Ontology roles)」来管理——和本体里其它资源走同一套授权体系。

原文特别提示:接口仍在积极开发中,支持范围会随平台更新而变化。目前大致分三档:

支持程度涉及的应用 / 服务
已支持Ontology Manager(定义/编辑/实现接口)、Marketplace(打包与安装接口)、Functions(TypeScript v2 函数)
部分支持Actions(可定义对"实现接口的对象"做增改删与链接,接口动作约束在 beta)、Object Set Service(按接口搜索排序)、Ontology SDK(作 API 层,TypeScript 已支持,Java/Python 在开发中)
暂不支持Workshop;Functions 的 TypeScript v1 与 Python 版本
给初学者的提醒:如果你照着教程想在某个应用里用接口却找不到入口, 先回到 Ontology Manager——它是目前定义、编辑和实现接口的主阵地。
7

动手:这个类型实现了接口吗?

判断依据只有"形状"——有没有那几个必填字段。

假设有接口 Facility,它要求实现者必须具备 facilityNamelocation 两个属性。 下面每个卡片列出一种对象类型所拥有的属性。 点击卡片,判断它是否实现了 Facility 接口。

候选对象类型(点我判定)
判定结果
← 点击左侧卡片,看它是否实现了 Facility 接口。

判断只看"形状"(有没有那两个字段),不看这个类型现实里叫什么、属于哪个行业。

一页带走

① 接口 = 形状与能力
抽象的规格清单,定义属性 / 链接约束 / 动作约束 / 元数据,自己不装数据。
② 多态:一次写好
面向接口写工作流,所有实现者自动兼容,新增类型无需重构。
③ 可继承可多实现
extend 继承并追加属性;对象类型可 implement 多个接口。
④ 抽象≠具体
接口不被数据集支撑、不能实例化;界面用虚线边框区分;支持范围仍在扩展。

延伸阅读 · 相关页面

按主题横向跳转,不必顺着目录一篇篇读。

常见问题速答 · FAQ

关于「接口(Interface):让不同对象"长得一样"」,读者最常问的几个问题。

一句话:接口描述"形状与能力"是什么?
在中文里,「接口(interface)」常被翻译得太技术化。你可以把它理解成一张 规格清单:一份对象类型要想"长得合规",就必须具备清单上列出的属性、链接和动作。接口本身不存任何数据,它只定义形状(shape)与能力(capabilities)。
一个例子:Facility 接口是什么?
设想你有一个 Facility(设施)接口,它规定:任何实现者都要有 Facility Name(设施名称)和 Location(位置)这两个属性。
接口由什么组成?
一个接口由四类东西拼成,我们可以对照着理解。
继承与实现:像搭积木一样复用是什么?
接口和编程语言里的接口很像,支持继承(extend)。你可以从已有接口 扩展(extend)出一个"子接口",它自动继承父接口的全部属性,再往上加更具体的属性。