在OpenAPI中,使用allof
可以实现继承。例如,在this example:OpenAPI/JSON Schema中的多继承/组合
"definitions": {
"Pet": {
"type": "object",
"allOf": [
{
"$ref": "#/definitions/NewPet" # <--- here
},
[...]
]
},
"NewPet": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
}
},
我没有关于多重继承规范什么发现。例如,如果Pet从NewPet和OldPet继承。
在Python中,我会写
class Pet(NewPet, OldPet):
...
和方法解析顺序是确定哪些父类,应首先检查方法/属性,所以我可以告诉如果Pet.age会NewPet.age或OldPet.age。
那么,如果我让Pet继承NewPet和OldPet,其中name属性是在两个模式中定义的,每个模式都有不同的值呢?什么是Pet.name?
"definitions": {
"Pet": {
"type": "object",
"allOf": [
{
"$ref": "#/definitions/NewPet" # <--- multiple inheritance
"$ref": "#/definitions/OldPet"
},
[...]
]
},
"NewPet": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
}
},
"OldPet": {
"type": "object",
"properties": {
"name": {
"type": "integer" # <-- name redefined here, different type
},
}
},
OldPet会优先吗? NewPet?它是未定义的/无效的?它是应用程序定义的?
我在swagger-editor试过这个。很显然,具有两个引用的架构是有效的,但是,swagger-editor不能解析这些属性。如果只是显示所有的两个引用。
编辑:根据this tutorial,有几个参考文献在同一个allof是有效的。但是对于两个模式具有不同属性且具有相同名称的情况没有任何说法。
谢谢。这个答案很清楚。我想这样做的结果是OpenAPI不应该只依靠一个'allOf'来管理继承,因为存在一些特殊情况,就像我公开的那样,其中Schemas彼此继承,但是'allOf'不能用过的。在这种情况下,像'x-inherits'或'x-childOf'这样的显式字段会派上用场。 –