2017-02-24 2 views
1

In OpenAPI wird die Vererbung mit allof erreicht. Zum Beispiel in this example:Mehrere Vererbung/Zusammensetzung in OpenAPI/JSON-Schema

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

fand ich nicht in der Spezifikation etwas über die Mehrfachvererbung. Zum Beispiel, wenn Pet von NewPet und OldPet erbt.

In Python, würde ich

class Pet(NewPet, OldPet): 
    ... 

und die Methode Auflösung Auftrag ist schreiben deterministisch über die Elternklasse sollte zunächst für Methoden überprüft werden/Attribute, so kann ich sagen, wenn Pet.age NewPet.age sein oder OldPet.age.

Also was, wenn ich Pet sowohl von NewPet als auch von OldPet erben lasse, wo name-Eigenschaft in beiden Schemas definiert ist, mit jeweils anderem Wert? Was wird Pet.name sein?

"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 
     }, 
     } 
    }, 

Wird OldPet Vorrang haben? Neues Haustier? Es ist nicht definiert/ungültig? Ist es Anwendung definiert?

Ich habe dies in swagger-editor versucht. Anscheinend ist das Schema mit zwei Referenzen gültig, aber swagger-editor löst die Eigenschaften nicht auf. Wenn nur allof mit den beiden Referenzen angezeigt wird.

Bearbeiten: Nach this tutorial, mehrere refs in der gleichen allof ist gültig. Aber es wird nichts über den Fall gesagt, dass beide Schemata ein anderes Attribut mit dem gleichen Namen haben.

Antwort

2

JSON-Schema unterstützt keine Vererbung. Das Verhalten von allOf kann manchmal wie Vererbung aussehen, aber wenn Sie darüber nachdenken, werden Sie am Ende verwirrt sein.

Das Schlüsselwort allOf bedeutet genau das, was es sagt: Alle Schemas müssen validiert werden. Nichts wird übergangen oder hat Vorrang vor allem anderen. Alles muss validiert werden.

In Ihrem Beispiel muss ein JSON-Wert vollständig gegen "NewPet" und "OldPet" validiert werden. Da es keinen JSON-Wert gibt, der sowohl als String als auch als Integer validiert werden kann, wird die Validierung der "name" -Eigenschaft immer nicht auf "NewPet" oder "OldPet" (oder beides) überprüft. Daher wird das Pet-Schema niemals gegen einen gegebenen JSON-Wert validiert.

+0

Danke. Diese Antwort macht alles klar. Die Konsequenz davon, denke ich, ist, dass OpenAPI sich nicht nur auf allOf verlassen sollte, um die Vererbung zu verwalten, da es Eckfälle gibt, wie die, die ich exponiert habe, wo Schemas von einander erben, aber 'allOf' nicht sein kann benutzt. In diesem Fall wäre ein explizites Feld wie "x-inherits" oder "x-childOf" nützlich. –

-2

Eine Sache zu betrachten ist, was Vererbung bedeutet. In Eclipse Modeling Framework wird versucht, eine Klasse zu erstellen, die zwei Klassen mit demselben Attribut erweitert. Nichtsdestoweniger betrachte ich diese Mehrfachvererbung.

Dies wird das Diamond-Problem genannt. Siehe https://en.wikipedia.org/wiki/Multiple_inheritance