У меня есть иерархия Line <- SPLine, Line <- DID_Line Line <- TollFree и т. Д. Затем для каждой строки есть тип действия. Так у меня это выглядит в xsd: </p>
<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>
Из них есть больше типов действий и типов линий. Но моя проблема - все, что я должен сделать, чтобы получить действие. Допустим, кто-то отправил мне сплайн, и я хочу получить действие, веб-служба принимает линейные объекты, поэтому я беру этот линейный объект, проверяю тип и затем выполняю соответствующее приведение. Я хотел бы просто переместить атрибут действия в строку, а затем исключить приведение. Единственное, что я могу видеть, что я могу сделать, это:
...
<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, и он вызовет подкласс, чтобы вернуть действие, которое было установлено. Если мне нужно превратить атрибут в элемент, это нормально.