我可以防止我的构造函数参数与VBA实例冲突吗?

时间:2018-12-31 12:35:27

标签: c# vba

对于在VBA环境中使用其类时如何覆盖需要自变量的构造函数,我有些困惑。

什么有效?

我已经在一个库中创建了几个类,每个类都有一个接口,以允许在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

出了什么问题?

当我在类中创建带有参数(即使是可选的)的构造函数时,VBA将停止允许我创建这些类的实例,它告诉我“ New”关键字无效,实际上不允许我选择如果我直接使用Dim t As New JamHeadArt.ClassEx,即使参数设置为可选(因此并不是真正需要的),也可以从我的库的对象的智能列表中获取该类。

这里令人讨厌的是-我实际上并没有想要我的VBA实例通过构造函数接受参数,它们主要用于单元测试,并且它们是可选字符串,因此默认为“ “ ...所以我想我的问题是类似

是否可以覆盖任何构造函数参数,以便在VBA环境中引用该参数时会忽略它们?

例如我真的希望我的构造函数看起来像这样:

public ClassEX(string s = "")
{

} 

在VBA中,它应该像Dim t As New JamHeadArt.ClassEX之前一样工作-但它里面没有可选字符串!

1 个答案:

答案 0 :(得分:1)

您可以添加其他构造函数,例如:

[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
}