2009-08-31 107 views
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,它會調用子類來返回設置的動作。如果我必須將該屬性轉換爲一個很好的元素。

回答

0

如果您想要爲每個子類型設置一組不同的限制,您需要進行強制轉換。您可以刪除XSD中的限制(僅將它們保留在代碼中),然後將屬性定義放入線型中。