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,它会调用子类来返回设置的动作。如果我必须将该属性转换为一个很好的元素。