在OpenAPI中,使用allof
实现继承。例如,在this example中:
"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不能解析这些属性。如果只显示带有两个引用的allof。
编辑:根据this tutorial,在同一个allof中有几个引用是有效的。但是没有任何关于两个模式具有相同名称的不同属性的情况。
答案 0 :(得分:3)
JSON Schema不支持继承。 allOf
的行为有时看起来像继承,但如果你这样想,你最终会感到困惑。
allOf
关键字意味着它的含义:所有模式都必须验证。没有任何东西被覆盖或优先于其他任何东西。一切都必须验证。
在您的示例中,JSON值必须完全针对“NewPet”和“OldPet”进行验证。因为没有可以作为字符串和整数验证的JSON值,所以“name”属性的验证将始终无法针对“NewPet”或“OldPet”(或两者)进行验证。因此,“Pet”架构永远不会针对任何给定的JSON值进行验证。
答案 1 :(得分:-2)
要考虑的一件事是继承意味着什么。在Eclipse Modeling Framework中,尝试创建一个扩展具有相同属性的2个类的类是一个错误。从来没有考虑过多重继承。