Я искал класс System.Xml.XmlWriter
, и я заметил, что это абстрактный класс вызова, и вам нужно создать новый объект с помощью метода Create, и мне было интересно, что было за ООП за этим, и почему бы не XmlWriter
быть больше похожим на классы от System.IO
.Что такое аргумент ООП за дизайном XmlWriter?
ответ
XmlWriter
- абстрактный базовый класс для классов, которые могут писать документы Xml. В docs вы можете видеть, что различные классы производны от XmlWriter
, которые пишут Xml для разных целей. Сам XmlWriter
просто определяет открытый интерфейс и некоторую поверхностную реализацию для Xml-авторов.
Это аналогично abstract TextWriter
class.
Статические методы Create
, по-видимому, существуют, потому что для определенных ситуаций (например, для записи в файл) рекомендуется использовать определенный подкласс. Этот подкласс создается посредством соответствующего метода Create
.
Обратите внимание, что XmlWriter.Create
для записи в файл необязательно создает XmlTextWriter
. Код платформы .NET может решить, что другой (возможно, внутренний) тип более подходит для вашей конкретной среды и настроек. Когда вы вызываете статический метод Create
, вам не нужно заботиться о том, какой тип фактически создается.
вы используете абстрактные классы, когда хотите поделиться определенными сведениями о реализации со всеми производными классами, но не позволяете пользователям просто инициализировать и использовать базовый абстрактный класс напрямую.
интерфейс является чистым абстрактным классом, что означает, что все методы и поля должны реализовываться классами, реализующими этот интерфейс, поэтому повторного использования кода вообще нет, кроме сигнатур методов/свойств.
для System.IO
классов, скорее всего, вы смотрите на классы, как Path
, File
, Directory
, я не вижу много абстрагироваться там, так как все файлы одинаковы, все каталоги одинаковы и т.д., в то время как XmlWriter является общим и в зависимости от конкретных случаев, производные конкретные классы будут выполнять необходимые специализации в каждом конкретном случае.
ответы от JaredPar и от Justin более конкретны для вашего вопроса в этом случае, мой ответ более общий об абстрактных классах с интерфейсами и не отвечает на ваш конкретный вопрос. Все еще оставляя мой ответ здесь, когда-то там ... –
Один из способов понять причину - посмотреть на набор виртуальных методов и типов, которые происходят от XmlWriter
. Практически все виртуальные методы относятся к разнообразию Write
. Быстрый взгляд на отражатель показывает более 10 производных типов, включая те, которые
- Написать вывод в стандартном текстовом пути
- Do utf8 трюков конкретных кодирования
- Написать вывод асинхронно
- записи + формат вывода
Основываясь на этом, основная причина для его абстрактного класса - позволить разработчикам настраивать вывод и способ записи вывода
На практике это factory method pattern и используется, когда вы хотите отвлечься от решения о том, какая реализация интерфейса или базового класса должна быть построена.
В этом случае из того, что я могу видеть, проверяя IL, когда вы используете XmlWriter.Create
, способ имеет несколько возможных различных внутренних типов, например. XmlUtf8RawTextWriterIndent
или HtmlUtf8RawTextWriter
- вам нужно использовать метод Create
для создания этих классов во-первых, потому что эти типы являются внутренними (и поэтому вы не можете напрямую ссылаться на их конструкторы), а также потому, что это метод Create
, который содержит логику, вокруг которой должен быть в каком сценарии.
- 1. Что такое Обоснование за дизайном GUID?
- 2. Что такое концепция ООП?
- 3. Что такое полиморфизм в ООП?
- 4. Проблема с дизайном ООП: Полиморфизм
- 5. Что такое родительский аргумент?
- 6. php ООП аргумент конструкции()
- 7. Что такое аргумент командной строки?
- 8. Что такое словарь массивов в ООП?
- 9. Что такое хороший визуальный урок ООП?
- 10. Что такое статические функции в ООП?
- 11. Что такое концепция ООП в следующей ситуации?
- 12. survfit.coxph: что такое аргумент newdata?
- 13. Что такое третий аргумент config.middleware.insert_before?
- 14. Что такое аргумент командной строки?
- 15. Что такое правильный аргумент pthread_create
- 16. Код ASP.Net За дизайном
- 17. Что это за аргумент ArgumentOutOfRangeException?
- 18. Что такое аргумент lmaxcount в API CreateSemaphore()?
- 19. Что такое "за" в Рубине
- 20. Что такое шутка за «goto $»?
- 21. Что такое перечислимый аргумент в Object.create?
- 22. Что такое аргумент «емкость» для tf.train.string_input_producer()
- 23. Что такое аргумент width в position_dodge?
- 24. Что такое аргумент -file для AWS EMR
- 25. Что такое второй аргумент $ parse() for?
- 26. Что такое аргумент privdata в redisAsyncCommand?
- 27. Что такое аргумент «mlefit», переданный в statsmodel.discrete.LogitResults?
- 28. Что такое второй аргумент для точки останова?
- 29. Что такое аргумент ретранслятора в пакете?
- 30. Что такое первый аргумент в 'JOptionPane.showConfirmDialog() здесь?
Возможно, вы захотите задать вопрос Microsoft. –
Я не согласен с * закрытием * голосов. Ответы на этот вопрос вполне могут быть «поддержаны фактами, ссылками или конкретным опытом». –