Choice Type是個美麗又邪惡的小女孩,她的彈性是種讓你無法承受的愛。想在密密麻麻的文件中尋得他的蹤跡,是件苦差事。當你揭開她的神秘面紗,你一定會深深的愛上他。
上一篇已經提到Choice Type 是該面對他的時候。
想要深入瞭解他,得從Extension這個資料型態的文件去瞭解他。
這個value[x] ,尤其是Type欄位的*,她帶著什麼樣的神秘事件呢?
他的意思是說,Extension有欄位叫value,他可以任意一種資料型態。能有多任意呢?以下的都可以。
- valueBase64Binary: base64Binary
- valueBoolean: boolean
- valueCanonical: canonical
- valueCode: code (only if the extension definition provides a fixed binding to a suitable set of codes)
- valueDate: date
- valueDateTime: dateTime
- valueDecimal: decimal
- valueId: id
- valueInstant: instant
- valueInteger: integer
- valueInteger64: integer64
- valueMarkdown: markdown
- valueOid: oid
- valuePositiveInt: positiveInt
- valueString: string
- valueTime: time
- valueUnsignedInt: unsignedInt
- valueUri: uri
- valueUrl: url
- valueUuid: uuid
- valueAddress: Address
- valueAge: Age
- valueAnnotation: Annotation
- valueAttachment: Attachment
- valueCodeableConcept: CodeableConcept
- valueCodeableReference: CodeableReference
- valueCoding: Coding
- valueContactPoint: ContactPoint
- valueCount: Count
- valueDistance: Distance
- valueDuration: Duration
- valueHumanName: HumanName
- valueIdentifier: Identifier
- valueMoney: Money
- valuePeriod: Period
- valueQuantity: Quantity
- valueRange: Range
- valueRatio: Ratio
- valueRatioRange: RatioRange
- valueReference: Reference - a reference to another resource
- valueSampledData: SampledData
- valueSignature: Signature
- valueTiming: Timing
- valueContactDetail: ContactDetail
- valueDataRequirement: DataRequirement
- valueExpression: Expression
- valueParameterDefinition: ParameterDefinition
- valueRelatedArtifact: RelatedArtifact
- valueTriggerDefinition: TriggerDefinition
- valueUsageContext: UsageContext
- valueAvailability: Availability
- valueExtendedContactDetail: ExtendedContactDetail
- valueDosage: Dosage
- valueMeta: Meta
有注意到了嗎?在JSON中,他的Tag Name(key) 是(欄位名稱+資料型態名稱)而資料型態名稱還得首字大寫。
其他資料型態也有此Choice Type的有Timing的repeat(這是個詭異結構)與Annotation。
程式解法很單純,提供一個ChoiceType當父類別,來處理一切雜事。提供各種情境的建構元。
接著就是複寫來自DataType的函數與實做介面。
這時候,74: IsChoiceType()就得設成true了。
其他最重要的就是88:與89:這兩行。89:宣告一個抽象函數,讓子類別來告訴父類別,目前這個Choice Type限定哪些資料型態。
88:然後有了GetSupportDataType()這個函數讓建構元來使用,確保抓到屬於這個Choice Type該有的Tag。
這就是子類別的樣子,其實差異只在於SupportType而已。