2017-02-24 16 views
1

OpenAPIでは、継承はallofで実現されます。例えば、this exampleに:OpenAPI/JSONスキーマの多重継承/合成

"definitions": { 
    "Pet": { 
     "type": "object", 
     "allOf": [ 
     { 
      "$ref": "#/definitions/NewPet" # <--- here 
     }, 
     [...] 
     ] 
    }, 
    "NewPet": { 
     "type": "object", 
     "properties": { 
     "name": { 
      "type": "string" 
     }, 
     } 
    }, 

私は多重継承に関する仕様は何で見つけることができませんでした。たとえば、ペットがNewPetとOldPetの両方から継承する場合、 Pythonで

、私は

class Pet(NewPet, OldPet): 
    ... 

を書くでしょうし、メソッド解決順序は、親クラスはメソッド/属性に対して最初にチェックすべきかについての決定論的であるので、Pet.ageはNewPet.ageになる場合、私が言うことができますまたはOldPet.age。

だから、名前のプロパティが両方のスキーマで定義されているNewPetとOldPetの両方からPetを継承させると、それぞれの値が異なります。ペットの名前は何ですか?

"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で試しました。どうやら、2つのリファレンスを持つスキーマは有効ですが、スワッガーエディタはプロパティを解決しません。 2つの参照とのアローフを表示するだけの場合。

編集:this tutorialによれば、同じアロフに複数の参照があると有効です。しかし、両方のスキーマが同じ名前の異なる属性を持つ場合については何も言及されていません。

答えて

2

JSONスキーマは継承をサポートしていません。 allOfの動作は、継承のように見えることもありますが、そのように考えると混乱することになります。

キーワードallOfは、それが言うことを意味します。すべてのスキーマが検証されなければなりません。何も上書きされたり、他のものより優先されるものはありません。すべてが検証されなければなりません。

例では、JSON値は、 "NewPet"と "OldPet"の両方に対して完全に検証する必要があります。文字列と整数の両方として検証できるJSON値がないため、 "name"プロパティの検証は常に "NewPet"または "OldPet"(またはその両方)に対して検証できません。したがって、 "Pet"スキーマは指定されたJSON値に対して決して検証されません。

+0

ありがとうございます。この答えはすべてのことを明確にします。その結果、OpenAPIは継承を管理するために 'allOf'を単独で使うべきではないということです。スキーマが互いに継承しますが、' allOf'はできません。中古。この場合、 'x-inherits'や' x-childOf'のような明示的なフィールドが便利です。 –

-2

継承が意味するものが1つあります。 EclipseのModeling Frameworkでは、同じ属性を持つ2つのクラスを拡張するクラスを作成しようとするとエラーになります。決して少ない私は複数の継承を考慮する。

これはダイヤモンド問題と呼ばれます。 https://en.wikipedia.org/wiki/Multiple_inheritance