首页 文章

OpenAPI / JSON模式中的多重继承/组合

提问于
浏览
2

在OpenAPI中,使用 allof 实现继承 . 例如,在_2534107中:

"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中有几个refs是有效的 . 但是没有任何关于两个模式具有相同名称的不同属性的情况 .

2 回答

  • 3

    JSON Schema不支持继承 . allOf 的行为有时看起来像继承,但如果你这样想,你最终会感到困惑 .

    allOf 关键字意味着它所说的:所有模式都必须验证 . 没有任何东西被覆盖或优先于其他任何东西 . 一切都必须验证 .

    在您的示例中,JSON值必须完全针对“NewPet”和“OldPet”进行验证 . 因为没有可以作为字符串和整数验证的JSON值,所以“name”属性的验证将始终无法针对“NewPet”或“OldPet”(或两者)进行验证 . 因此,“Pet”架构永远不会针对任何给定的JSON值进行验证 .

  • -2

    要考虑的一件事是继承意味着什么 . 在Eclipse Modeling Framework中,尝试创建一个扩展具有相同属性的2个类的类是一个错误 . 从来没有考虑过多重继承 .

    这被称为钻石问题 . 见https://en.wikipedia.org/wiki/Multiple_inheritance

相关问题