Схема XML для типа .NET, которая наследует и реализует - PullRequest
2 голосов
/ 22 марта 2010

Пожалуйста, рассмотрите следующие три типа .NET: у меня есть интерфейс, абстрактный класс и конкретный класс. Мой вопрос заключается в том, как написать XML-схему для включения свойств из интерфейса и абстрактного класса.

public interface IStartable
{
    bool RequiresKey { get; set; }

    void Start(object key);
}

public abstract class Vehicle
{
    uint WheelCount { get; set; }
}

public class Car : Vehicle, IStartable
{
    public bool RequiresKey { get; set; }

    public string Make { get; set; }

    publilc string Model { get; set; }


    public Car() {}

    public void Start(object key)
    {
        // start car with key
    }
}

Я не знаю, как завершить эту схему:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="cars"
    xmlns="cars"
    xmlns:c="cars">

    <!-- How do I get car to have vehicle's wheelcount
         AND IStartable's RequiresKey? -->
    <xs:element name="Car" type="c:Car" />
    <xs:complexType name="Car">
        <xs:complexContent>
            <xs:extension base="c:Vehicle">
                <xs:group ref=c:CarGroup" />
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:group name="CarGroup">
        <xs:sequence>
            <xs:element name="Make" type="xs:token" />
            <xs:element name="Model" type="xs:token" />
        </xs:sequence>
    </xs:group>

    <xs:complexType name="Vehicle">
        <xs:sequence>
            <xs:element name="WheelCount" type="xs:unsignedInt" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="IStartable">
        <xs:sequence>
            <xs:element name="RequiresKey" type="xs:boolean" />
        </xs:sequence>
    </xs:complexType>

</xs:schema>

1 Ответ

1 голос
/ 22 марта 2010

Я действительно не понимаю, как вы могли бы сделать это в XML-схеме. У XML-схемы есть наследование, но только одно наследование, и оно не знает об интерфейсах и т. Д.

В текущей XML-схеме нет способа, чтобы класс (сложный тип) основывался как на базовом классе, так и в то же время "наследовал" от второго "интерфейсного" класса - XML-схема просто не имеет таких понятия, извините.

Возможно, вы сможете немного переработать наследование - IStartable > Vehicle > Car - тогда вы можете смоделировать его в XML-схеме. Текущая настройка, вероятно, просто невозможна с использованием текущих стандартов XML-схем.

...