2

在 OpenAPI 中,继承是通过allof. 例如,在此示例中:

  "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 会优先吗?新宠物?它未定义/无效?它是应用程序定义的吗?

我在swagger-editor中试过这个。显然,具有两个 refs 的模式是有效的,但 swagger-editor 不解析属性。如果只显示两个引用的 allof。

编辑:根据本教程,在同一个 allof 中有多个 refs 是有效的。但是,对于两个模式具有相同名称的不同属性的情况,什么也没说。

4

2 回答 2

4

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

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

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

于 2017-02-26T21:04:28.530 回答
-2

要考虑的一件事是继承意味着什么。在 Eclipse 建模框架中,试图创建一个扩展 2 个具有相同属性的类的类是错误的。我始终认为多重继承。

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

于 2017-06-25T12:45:24.090 回答