2013-03-12 2 views
2

Я искал класс System.Xml.XmlWriter, и я заметил, что это абстрактный класс вызова, и вам нужно создать новый объект с помощью метода Create, и мне было интересно, что было за ООП за этим, и почему бы не XmlWriter быть больше похожим на классы от System.IO.Что такое аргумент ООП за дизайном XmlWriter?

+3

Возможно, вы захотите задать вопрос Microsoft. –

+0

Я не согласен с * закрытием * голосов. Ответы на этот вопрос вполне могут быть «поддержаны фактами, ссылками или конкретным опытом». –

ответ

1

XmlWriter - абстрактный базовый класс для классов, которые могут писать документы Xml. В docs вы можете видеть, что различные классы производны от XmlWriter, которые пишут Xml для разных целей. Сам XmlWriter просто определяет открытый интерфейс и некоторую поверхностную реализацию для Xml-авторов.

Это аналогично abstract TextWriter class.

Статические методы Create, по-видимому, существуют, потому что для определенных ситуаций (например, для записи в файл) рекомендуется использовать определенный подкласс. Этот подкласс создается посредством соответствующего метода Create.

Обратите внимание, что XmlWriter.Create для записи в файл необязательно создает XmlTextWriter. Код платформы .NET может решить, что другой (возможно, внутренний) тип более подходит для вашей конкретной среды и настроек. Когда вы вызываете статический метод Create, вам не нужно заботиться о том, какой тип фактически создается.

1

вы используете абстрактные классы, когда хотите поделиться определенными сведениями о реализации со всеми производными классами, но не позволяете пользователям просто инициализировать и использовать базовый абстрактный класс напрямую.

интерфейс является чистым абстрактным классом, что означает, что все методы и поля должны реализовываться классами, реализующими этот интерфейс, поэтому повторного использования кода вообще нет, кроме сигнатур методов/свойств.

для System.IO классов, скорее всего, вы смотрите на классы, как Path, File, Directory, я не вижу много абстрагироваться там, так как все файлы одинаковы, все каталоги одинаковы и т.д., в то время как XmlWriter является общим и в зависимости от конкретных случаев, производные конкретные классы будут выполнять необходимые специализации в каждом конкретном случае.

+0

ответы от JaredPar и от Justin более конкретны для вашего вопроса в этом случае, мой ответ более общий об абстрактных классах с интерфейсами и не отвечает на ваш конкретный вопрос. Все еще оставляя мой ответ здесь, когда-то там ... –

1

Один из способов понять причину - посмотреть на набор виртуальных методов и типов, которые происходят от XmlWriter. Практически все виртуальные методы относятся к разнообразию Write. Быстрый взгляд на отражатель показывает более 10 производных типов, включая те, которые

  • Написать вывод в стандартном текстовом пути
  • Do utf8 трюков конкретных кодирования
  • Написать вывод асинхронно
  • записи + формат вывода

Основываясь на этом, основная причина для его абстрактного класса - позволить разработчикам настраивать вывод и способ записи вывода

3

На практике это factory method pattern и используется, когда вы хотите отвлечься от решения о том, какая реализация интерфейса или базового класса должна быть построена.

В этом случае из того, что я могу видеть, проверяя IL, когда вы используете XmlWriter.Create, способ имеет несколько возможных различных внутренних типов, например. XmlUtf8RawTextWriterIndent или HtmlUtf8RawTextWriter - вам нужно использовать метод Create для создания этих классов во-первых, потому что эти типы являются внутренними (и поэтому вы не можете напрямую ссылаться на их конструкторы), а также потому, что это метод Create, который содержит логику, вокруг которой должен быть в каком сценарии.

Смежные вопросы