0
我有一個行的層次結構< --SPLine,行< --DID_Line行< -TollFree等。然後對於每一行有一種行動。所以我看起來像這樣在xsd:XSD屬性和摘要
<xsd:complexType name="line" abstract="true">
<xsd:complexContent>
<xsd:extension base="tns:executable">
<xsd:sequence>
...
</xsd:sequence>
<xsd:attribute name="type" type="tns:line_type" />
<xsd:attribute name="switch_type" type="tns:switch_type" />
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="toll_free">
<xsd:complexContent>
<xsd:extension base="tns:line">
<xsd:sequence>
...
</xsd:sequence>
<xsd:attribute name="action" type="tns:basic_actions" />
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="did_line">
<xsd:complexContent>
<xsd:extension base="tns:line">
<xsd:attribute name="action" type="tns:suspendable_actions"/>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:complexType name="spLine">
<xsd:complexContent>
<xsd:extension base="tns:line">
<xsd:attribute name="action" type="tns:suspendable_actions" />
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
<xsd:simpleType name="line_action" >
<xsd:restriction base="xsd:string">
<xsd:enumeration value="add" />
<xsd:enumeration value="delete">
</xsd:enumeration>
<xsd:enumeration value="remove">
<xsd:enumeration value="suspend" />
<xsd:enumeration value="restore" />
<xsd:enumeration value="update" />
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="basic_actions">
<xsd:restriction base="tns:line_action">
<xsd:enumeration value="add" />
<xsd:enumeration value="remove" />
</xsd:restriction>
</xsd:simpleType>
有更多的行動類型和行類型。但我的問題是我必須做的所有事情來獲得行動。所以我們可以說有人給我發送了一個樣條線,我想要得到這個動作,Web服務接受一個線對象,所以我接受這個線對象檢查類型,然後進行相應的轉換。我想只將行爲屬性移動到行,然後消除強制轉換。我可以看到我能做的唯一的事情是這樣的:
...
<xsd:complexType name="toll_free">
<xsd:complexContent>
<xsd:extension base="tns:line">
<xsd:sequence>...
</xsd:sequence>
<xsd:attribute ref="tns:basic_actions" />
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
但是,這只是給了我一堆額外的方法,我仍然需要演員。那麼我怎麼才能讓這個多態方法工作,這樣我就可以說line.getAction,它會調用子類來返回設置的動作。如果我必須將該屬性轉換爲一個很好的元素。