Часто бывает полезно иметь абстрактные классы с несколькими производными типами, чтобы разрешить использование строго типизированных списков и тому подобное.
Например, у вас может быть класс DocumentFragment, который является абстрактным, и два конкретных класса с именами TextDocumentFragment и CommentDocumentFragment (этот пример от Willis).
Это позволяет создать свойство List, которое может содержать объекты только этих двух типов.
Если вы попытаетесь создать WebService, который возвращает этот список, вы получите сообщение об ошибке, но это легко обойти с помощью приведенного ниже кода ....
[Serializable()]
[System.Xml.Serialization.XmlInclude(typeof(TextDocumentFragment))]
[System.Xml.Serialization.XmlInclude(typeof(CommentDocumentFragment))]
public abstract class DocumentFragment {
...}
Атрибуты XmlInclude сообщают классу, что он может быть сериализован в эти два производных класса.
Создает атрибут в элементе DocumentFragment, указывающий фактический тип, как показано ниже.
<DocumentFragment xsi:type="TextDocumentFragment">
Любые дополнительные свойства, специфичные для производного класса, также будут включены с использованием этого метода.