Можно ли опускать руки? - PullRequest
2 голосов
/ 23 июня 2009

Я разрабатываю фреймворк, который пользователи могут расширять. По сути, я предоставлю им набор интерфейсов, которые они могут реализовать, и мой класс «manager» будет вызывать их реализации следующим образом:

abstract1 = factory.GetConcreteExtension1()
abstract2 = factory.GetConcreteExtension2()
abstract1.DoSomething(abstract2)

Где мой клиент реализует конкретную версию абстракций. Однако они могут решить добавить данные в concrete2, которого нет в интерфейсе abstract2. Это заставит их понижать abstract2 к concrete2 в concrete.DoSomething.

Это похоже на запах кода, потому что я заставляю их реализовать метод (DoSomething), который в своей подписи ожидает abstract1, но на самом деле может получить только конкретный1 (плюс я заставляю их писать приведение).

Я не могу найти решение, которое бы одновременно четко определяло контракт и позволяло моей платформе самостоятельно управлять процессом. Есть идеи?

Ответы [ 2 ]

2 голосов
/ 23 июня 2009

То есть DoSomething abstract1 вызывается с параметром abstract2, и вы хотите получить данные abstract2 из метода DoSomething?

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

1 голос
/ 23 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...