Могу ли я представить класс из другого пространства имен .net как класс в моем пространстве имен?
-
02-07-2019 - |
Вопрос
Могу ли я представить класс из другого пространства имен .net как класс в моем пространстве имен?Я использую класс antlr.collections.AST в качестве типа возвращаемого значения для функции, принадлежащей классу в моем пространстве имен;в результате пользователь должен иметь
using antlr.collections;
using myNamespace;
вверху своих файлов, чтобы использовать мою функцию.Могу ли я сделать myNamespace.AST псевдонимом для antlr.collections.AST, чтобы пользователю достаточно было
using myNamespace;
вверху своих файлов?
Решение
Имейте в виду, что потребители вашего кода на самом деле не будут нуждаться иметь использование операторов.Они созданы для того, чтобы облегчить им жизнь, чтобы им не приходилось вводить antlr.collections.Foo и antlr.collections.Bar по всему исходному коду.
Более серьезное «воздействие» (если оно действительно серьезное) заключается в том, что потребителю вашего кода понадобится жесткая ссылка на сборку, в которой определен antlr.collections.
Однако, если это задокументировано заранее, я, честно говоря, не вижу в этом такой уж большой проблемы.Это ничем не отличается от потребителя DAL, сгенерированного SubSonic, которому необходимы ссылки как на сгенерированную сборку DAL, так и на исходную сборку SubSonic.(И, вполне возможно, также с использованием операторов.)
Зависимости такие, какие они есть.Есть причина, по которой классы разбиты на пространства имен — в первую очередь для организации и уменьшения конфликтов имен.Не зная, какие классы находятся в упомянутом вами пространстве имен, я не знаю, насколько вероятен такой конфликт в вашем сценарии...Но пытаться переместить класс из одного пространства имен в другое или скрыть тот факт, что это необходимо, производя от него пустой класс, вероятно, не лучшая идея.Наличие еще одной ссылки и оператора использования не убьет потребителей вашего класса.
Другие советы
Как насчет создания класса с тем же именем в новом пространстве имен?Я имел в виду:
namespace MyForms {
class Class1 : Some.Other.Namespace.Class1 {
// ...
}
}
создайте новый класс, который наследует класс в вашем новом пространстве имен.Это не идеально, но полезно для модульного тестирования и тому подобного.
Однако вам следует подумать, почему вы это делаете: классы не зря разбиваются на пространства имен.
Нет, ты не можешь.
Полный путь и имя класса являются частью его идентификации.
Если вы производите класс и возвращаете свой производный класс, вы берете на себя ответственность за предоставление всей документации для возвращаемого типа.
Я думаю, вы окажете разработчикам, использующим вашу библиотеку, медвежью услугу, потому что они не обязательно будут знать, что на самом деле они работают с типом из antir.collections (не то чтобы я даже знал, что это такое, но это не так). смысл).Если разработчик заходит на StackOverflow.com в поисках информации об этом типе возвращаемого значения, с большей вероятностью он найдет информацию, если тип взят из «общей» библиотеки или из вашей?
Единственное решение — скрыть всю зависимость от типа antlr.collections.AST.
Вы можете использовать Адаптер для этой цели.