为什么一个方法会在 VBA 中成功运行,即使它没有列在特定 class 下的对象库中?

Why would a method work successfully in VBA even though it's not listed in the object library under the specific class?

在 VBA 中,我引用了 Microsoft HTML 插件。我将变量声明为 IHTMLelement 对象。从那里,我仍然可以使用 .getelementsbyclassname 方法而不会出现语法错误,尽管这没有在 IHTML 元素 class 的可能方法下列出。对于其他几个变量,这是一种可接受的方法,但我不明白为什么它对这个有效

Sub overflowquestion()

'Turn on References to Microsoft Internet Controls and Microsoft HTML 

'Object Library before running

Dim IE As New InternetExplorer, el As IHTMLElement, sl As IHTMLElement

IE.navigate "www.youtube.com"

Do While IE.readyState <> 4

    DoEvents

Loop

Set el = IE.document.getElementsByClassName("skip-nav")(0)

'Why does this next line work?

Set sl = el.getElementsByClassName("masthead-search-terms-border")(0)


End Sub

这里有很多事情需要理解。

el 不是接口的实例 IHTMLElement 它是实现 IHTMLElement 接口的 class 元素的实例。 类 可以实现多个接口。 Element class 可能继承自另一个 class,它可能实现其他几个接口,其中一个 classes/interfaces 具有方法 getElementsByClassName

正如 Paulo Madeira 在评论中指出的那样,VBA 能够进行后期绑定(请参阅 overview of Interfaces, Classes, late an early binding 的文档),因此它会尝试调用对象上的方法,无论接口是否显示能不能。