Как получить различный тип значения из конкретной реализации, если известен только интерфейс / абстрактный класс? - PullRequest
3 голосов
/ 28 февраля 2011

что я использую:
VB.NET, NET 3.5, OpenXML SDK 2.0

что я хочу сделать:
Ясоздание программы чтения / записи xlsx для моего приложения (на основе OpenXML SDK 2.0).Я хочу прочитать файлы xlsx и сохранить данные, содержащиеся в каждой строке, в DTO / PONO.Далее я хочу прочитать файл xlsx, а затем изменить его и сохранить.

мои мысли:
Теперь моя проблема не связана с OpenXML SDK, я могу делать то, что мне нужноделать.

Моя проблема заключается в том, как структурировать мои компоненты.В частности, у меня проблемы с полиморфизмом на самом низком уровне электронной таблицы, ячейка.

С ячейкой в ​​Excel / OpenXML могут быть связаны разные типы данных.Как время, дата, число, текст или формула.Эти различные типы необходимо обрабатывать по-разному при чтении / записи из / в электронную таблицу.

Я решил создать общий интерфейс для всех подтипов, таких как TextCell, NumberCell, DateCell и т. Д.

Я прочитал ячейку из электронной таблицы, которую Метод / Фабрика может решить, какой тип ячейки создать.

Теперь, поскольку ячейка является абстракцией от реальной реализации, она не знает / не должна знать, какого типаэто.Для записи / изменения ячейки я решаю эту проблему, вызывая .write (ICellWriter) для ячейки, которую я хочу сохранить.Поскольку сама ячейка знает, какой тип данных она содержит, она знает, какой метод ICellWriter необходимо вызвать (статический полиморфизм).

Моя проблема:
Запись в файл xlsxне проблемаМоя проблема в том, как мне получить данные из моей ячейки в мой DTO / PONO, не прибегая к проверке типов -> If TypeOf variable is ClassX then doesomething End If.Так как методы / свойства должны иметь разные сигнатуры, а различение только с использованием другого типа возврата не допускается.

Редактировать:

Держатель (коллекция, в данном случае строка таблицы /электронная таблица) объектов (ссылающихся на ячейки) не знает конкретных реализаций.Поэтому для написания ячейки я передаю ее Cellwriter.Этот Cellwriter имеет перегруженные методы, такие как Write(num as Integer), Write(text as String), Write(datum as Date).Объект ячейки, который получает это переданное ему, затем вызывает метод Write() с типом данных, который он содержит.Это работает, так как возвращаемое значение не передается обратно.

Но что мне делать, когда мне нужен конкретный тип возвращаемых данных?

Любые идеи, советы, понимание?

Спасибо

Редактировать:
Глоссарий:

  • DTO: Объект передачи данных
  • PONO: Простой старый объект .Net
  • xlsx: ссылка на окончание файла в файлах книги Excel

Редактировать:
"Подтипы" ячейки реализуют общий интерфейс и не наследуются от общего суперкласса.

Редактировать:
Подумав о проблеме, я понял, что это невозможно без размышлений или знаний о том, какого типа ячейку я ожидаю.По сути, я пытался воссоздать электронную таблицу или что-то похожее по функциональности и слишком абстрактное / конфигурируемое для моих нужд.Спасибо за ваше время и усилия, вложенные в написание ответа.Я принял ответ, который был ближе всего к тому, что я понял.

1 Ответ

0 голосов
/ 01 марта 2011

Я не думаю, что вы можете.

Если я правильно понимаю, у вас есть разные типы ячеек (StringCell, IntCell), и каждый из этих конкретных классов возвращает объект типа 'Object',Когда вы используете базовый класс 'Cell' и получаете его значение - он имеет тип Object.

Для работы с ним как String, или Integer, Or Date и т. Д. И т. Д. ... Я думаю,вам нужно проверить тип этого объекта, так или иначе.Вы можете использовать TypeOf, как вы продемонстрировали;Я также видел такие вещи, как «.GetValueAsString () /. GetValueAsInteger ()» в базовом классе.Но вам все еще нужны знания, достаточные для того, чтобы сказать «Dim myInt as Integer = myCell.GetValueAsInteger ()» *

Вообще говоря, по крайней мере, если вы подписываетесь на принципах SOLID, вам все равно.*

В нем говорится, что в компьютерной программе, если S является подтипом T, объекты типа T могут быть заменены объектами типа S (т.е. объекты типа S могут заменять объекты типа T),без изменения каких-либо желательных свойств этой программы (правильность, выполненная задача и т. д.)

http://en.wikipedia.org/wiki/Liskov_substitution_principle

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

Я не знаю, что вы намерены делать со значениями в ячейках, которые потребовали бы, чтобы у вас был конкретный класс вместо использования базы;но может быть возможно выставить эту функциональность в самой базе.IE - если вам нужно добавить две ячейки, вы можете сделать это, обрабатывая их как общие ячейки (возможно, по крайней мере, при условии, что они имеют совместимые типы), не зная, какой они подтип.Вы должны иметь возможность вернуть базовый класс в вашем DTO, независимо от того.

По крайней мере, я так понимаю.Я, конечно, подожду, пока больше людей присоединятся, прежде чем слушать меня.

...