Excel 阻止用户实例化接口而不是其实现

Excel 阻止用户实例化接口而不是其实现,excel,vba,Excel,Vba,对于个人项目,我在VBA工作簿中准备了一些接口,这些接口应该由最终用户实现 如果我用Java这样的语言编码,我将无法实例化接口,因为编译器会阻止我: 问候语.java public interface Greetings { public String sayHello(String person); } public class GreetingsImpl implements Greetings { @Override public String sayHello

对于个人项目,我在VBA工作簿中准备了一些接口,这些接口应该由最终用户实现

如果我用Java这样的语言编码,我将无法实例化接口,因为编译器会阻止我:

问候语.java

public interface Greetings {
    public String sayHello(String person);
} 
public class GreetingsImpl implements Greetings {
    @Override
    public String sayHello(String person) {
        return "Hello " + person;
    }
}
欢迎Simple.java

public interface Greetings {
    public String sayHello(String person);
} 
public class GreetingsImpl implements Greetings {
    @Override
    public String sayHello(String person) {
        return "Hello " + person;
    }
}
代码

Greetings greets = new GreetingsImpl(); //<-- OK
Greetings greets = new Greetings(); //<-- ERROR: Greetings is abstract; cannot be instantiated
Dim greets As IGreetings
Set greets = New Greetings
MsgBox greets.sayHello("Matteo") '<-- it works

Set greets = New IGreetings
MsgBox greets.sayHello("Matteo") '<-- it shows empty, but it works
问候

Public Function sayHello(person As String) As String
End Function
Implements IGreetings
Public Function IGreetings_sayHello(person As String) As String
    IGreetings_sayHello = "Hello " & person
End Function 
代码

Greetings greets = new GreetingsImpl(); //<-- OK
Greetings greets = new Greetings(); //<-- ERROR: Greetings is abstract; cannot be instantiated
Dim greets As IGreetings
Set greets = New Greetings
MsgBox greets.sayHello("Matteo") '<-- it works

Set greets = New IGreetings
MsgBox greets.sayHello("Matteo") '<-- it shows empty, but it works
Dim作为igreeting问候
设置问候语=新问候语

MsgBox问候.sayHello(“Matteo”)”这不是VBA的限制,而是经典VB的一个功能:每个类都定义一个接口——类的默认接口:这是任何类都可以实现任何其他接口的方式

因此,无法为此获取编译时错误

不过,静态代码分析工具可以提供帮助。警告具有实现的接口成员(该页面上的代码示例可能需要更清楚),但在实例化接口时不会发出警告。。。不过,我们可以很容易地实现一个对实例化接口类发出警告的检查


除此之外,您还可以通过在
类_Initialize
处理程序中抛出一个错误,为
New
-设置作为抽象接口的内容,获得一个运行时错误,.

您无法阻止他们实例化接口,但您可以添加一个class\u initialize方法,该方法会在消息框中弹出相应的错误。如果有人希望通过执行该检查为RuberDuck做出贡献,请参阅。非常感谢Mathieu的解释和RuberDuck中的问题。我将阅读存储库规则,看看能否在未来几天内亲自向您发送一个拉取请求。@MatteoNNZ真棒!!如果您需要帮助,请随时询问!