2009-08-31 10 views
0

J'ai une hiérarchie de Ligne < --SPLine, Ligne < - Ligne LigneDID < --TollFree etc. Ensuite, pour chaque ligne, il y a un type d'action. Donc je l'ai comme ça dans le xsd:Attributs XSD et résumé

<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> 

De plus il y a plus de types d'actions et de lignes. Mais mon problème de mine est tout le casting que je dois faire pour obtenir l'action. Alors disons que quelqu'un m'envoie une spline et que je veux obtenir l'action, eh bien le service web accepte un objet ligne donc je prends cet objet ligne, vérifie le type puis fais le cast approprié. Je voudrais juste déplacer l'attribut d'action à la ligne et ensuite éliminer la distribution. La seule chose que je peux voir que je peux faire est la suivante:

...

<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> 

Mais cela me donne juste un tas de méthodes supplémentaires et j'ai toujours besoin de la distribution. Alors, comment puis-je obtenir cette méthode polymorphe pour que je puisse juste dire line.getAction et il appellera la sous-classe pour retourner l'action qui a été définie. Si je dois transformer l'attribut en un élément qui va bien.

Répondre

0

Si vous souhaitez disposer d'un ensemble de restrictions différent par sous-type, vous devez diffuser. Vous pouvez supprimer les restrictions du fichier XSD (conservez-les dans le code uniquement), puis placez la définition d'attribut dans le type de ligne.