Perché un programma dovrebbe consentire l'inizializzazione di un oggetto quando non supporta tutti i metodi / proprietà del tipo di interfaccia che è stato definito come?

2

Ho l'impressione che un oggetto DEVE supportare tutti i metodi / proprietà dopo essere stato inizializzato altrimenti il programma creerà un errore. Tuttavia, se vedi sotto, sto definendo 2 variabili (doc ed el) come htmldocuments. Quindi qualsiasi oggetto assegnato a queste variabili deve in teoria supportare tutti i metodi / proprietà htmldocument, altrimenti verrà generato un errore. In questo scenario, doc è la variabile di controllo ed el è la variabile di test. "doc" è impostato su un oggetto documento, che può ovviamente supportare tutti i metodi di interfaccia htmldocument. "el" è impostato su un singolo htmlparagraphelement, che NON PU support supportare tutti i metodi di interfaccia htmldocument. Tuttavia, non si verifica alcun errore. Nella riga successiva, eseguo il test del metodo dell'interfaccia htmldocument chiamato "createRange" su entrambe le variabili. Funziona bene (come previsto) con la variabile doc. Viene generato un errore con la variabile el che dice "L'oggetto non supporta questo metodo". Anche questo è previsto, ma quello che non capisco è che sono arrivato così lontano in primo luogo. Non dovrebbe essere stato generato un errore quando l'oggetto è stato inizializzato?

VBA:

'Turn on references to Microsoft Internet Controls
'and Microsoft HTML Object Libraries before running

Sub qstn()

Dim IE As New InternetExplorer
'Note that both doc and el are declared within the HTMLdocument interface
Dim doc As HTMLDocument, el As HTMLDocument

IE.navigate "https://www.youtube.com/"

IE.Visible = True

Do Until IE.ReadyState = 4: Loop

'No error expected here.  Document object is returned
'which has all properties and methods of HTMLDocument interface
Set doc = IE.Document

'Why am I not getting a type mismatch here?
'I should not be allowed to go any further on this line
Set el = IE.Document.getElementsByTagName("p")(0)

'Random method to prove that the actual document object can execute this method
doc.createRange

'Same method used on the object that was also declared as HTMLdocument,
'but was set as an htmlparagraphelement.  This will not working
'because the htmlparagraphelement doesn't support it
el.createRange

End Sub
    
posta apdm 13.07.2015 - 22:09
fonte

1 risposta

3

Per la maggior parte, VBA utilizza late binding, non il tipo di associazione anticipata che stai descrivendo.

In linguaggi strongmente tipizzati come C #, otterrai il comportamento che ti aspetti, perché il compilatore controllerà le tue chiamate di metodo rispetto alle definizioni di classe e si lamenterà che non corrispondono. Questo è precoce.

Tuttavia, in un linguaggio poco cogente e tardivo come VBA, non si ottiene l'errore finché l'interprete non tenta effettivamente di eseguire il codice incriminato.

    
risposta data 13.07.2015 - 22:59
fonte

Leggi altre domande sui tag