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.
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. –