Я немного озадачен тем, как я могу переопределить конструкторы, требующие аргументы, при использовании их классов в среде VBA.
Что работает?
Я создал несколько классов в библиотеке, каждый с интерфейсом, чтобы обеспечить полную совместимость с intellisense при использовании этой библиотеки в VBA
С конструкторами или без них эти классы работают нормально, например
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("JamHeadArt.ClassEX")]
[Guid("XYZ")]
public partial class ClassEX : IClassEX
{
public ClassEX()
{
// Empty constructor here, some of mine have processes, all work well
}
// Methods/ Properties as outlined by the interface below
}
[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
[Guid("ABC")]
public interface IClassEx
{
// Various methods / fields / properties to be implemented by ClassEX
}
Затем я добавляю ссылку на мою библиотеку и пишу простые строки кода в VBA для создания экземпляров и доступа к моим классам:
Sub Test()
Dim t As JamHeadArt.ClassEX
Set t = New JamHeadArt.ClassEX
' Using t.dot then provides all the methods needed '
End Sub
Что идет не так?
Когда я создаю в классе consttructors с аргументами (даже если они необязательны), VBA прекращает разрешать мне создавать экземпляры этих классов, он сообщает мне, что ключевое слово "New" недопустимо и фактически не позволяет мне выбирать класс из intellisense список объектов в моей библиотеке, если я Dim t As New JamHeadArt.ClassEx
даже если для параметров задано необязательное значение (поэтому в действительности не требуется)
Раздражает то, что на самом деле я не хочу, чтобы мои экземпляры VBA принимали параметры через конструктор, они в основном предназначены для модульного тестирования и являются необязательными строками, поэтому по умолчанию используется значение ""... поэтому я предполагаю, что мой вопрос что-то вроде
Можно ли переопределить какие-либо параметры конструктора, чтобы при обращении к ним в среде VBA они игнорировались?
например, я действительно хочу, чтобы мой конструктор выглядел так:
public ClassEX(string s = "")
{
}
и в VBA он должен работать как прежде Dim t As New JamHeadArt.ClassEX
- но это не будет с этой необязательной строкой!
Вы можете добавить дополнительный конструктор, например:
[ComVisible(true)]
[ClassInterface(ClassInterfaceType.None)]
[ProgId("JamHeadArt.ClassEX")]
[Guid("XYZ")]
public partial class ClassEX : IClassEX
{
public ClassEX()
{
// Empty constructor here, some of mine have processes, all work well
}
public ClassEX(string foo)
{
// additional constructor, can be used for unit testing etc.
}
// Methods/ Properties as outlined by the interface below
}
internal
конструктор иpublic
конструктор. Внутренний может быть для модульного тестирования, а публичный - для VBA. ИспользуйтеInternalsVisibleToAttribute
чтобы этот конструктор мог видеть только приложение модульного тестирования. Это возможное решение, но я не люблю писать код только для модульного тестирования. В основном это недостаток дизайна, но иногда другого пути нет. Трудно сказать, поскольку у меня ограниченная информация о вашем деле, но, по крайней мере, это одно из решений.