toma sobreescritura sobrecarga polimorfismo para ninguna metodos metodo ejemplos ejemplo constructores conclusion argumentos c# vbscript overloading

c# - sobreescritura - ¿Qué sobrecarga de método será accesible desde VBScript?



sobrecarga de metodos c# pdf (2)

Esta pregunta ya tiene una respuesta aquí:

System.Collections.ArrayList es ComVisible(true) . Contiene tres sobrecargas de IndexOf (ver aquí ):

public virtual int IndexOf(Object value) public virtual int IndexOf(Object value, int startIndex) public virtual int IndexOf(Object value, int startIndex, int count)

Desde VBScript, solo se puede acceder a la segunda sobrecarga:

Dim oList Set oList = CreateObject("System.Collections.ArrayList") ''oList.IndexOf "foo" ''Error: Invalid procedure call or argument: ''IndexOf'' oList.IndexOf "foo", 0 ''oList.IndexOf "foo", 0, 1 ''Error: Wrong number of arguments or property assignment was not valid: ''IndexOf''

En ''Sobrecarga de un método en com visible dll'', Hans Passant explica que existen métodos de sobrecarga en el ensamblado, pero del script no se puede obtener su dispid y, por lo tanto, llamarlos. Esto parece implicar que un método podría superarlo.

  • ¿Puedo determinar a partir de la fuente ArrayList (o en otro lugar), qué método será accesible? ¿Cuáles son las reglas que rigen este proceso de selección?
  • ¿Por qué los mensajes de error son diferentes para el caso uno y tres?

Las sobrecargas tienen alias numerados:

>> Set al = CreateObject("System.Collections.ArrayList") >> al.Add "poo" >> al.Add "foo" >> WScript.Echo al.IndexOf("poo", 0) >> 0 >> WScript.Echo al.IndexOf("poo", 1) >> -1 >> WScript.Echo al.IndexOf_1("foo") >> Error Number: 438 Error Description: Object doesn''t support this property or method >> WScript.Echo al.IndexOf_2("foo") >> Error Number: 5 Error Description: Invalid procedure call or argument >> WScript.Echo al.IndexOf_3("foo") >> 1 >>

Uso prueba y error para resolverlo; puede haber documentos o herramientas de introspección para un enfoque más científico.


Respuesta corta: todos ellos.

Analicemos qué ha escrito @ hans-passant ;

Respuesta a Sobrecargar un método en com visible dll
COM no tiene soporte para sobrecargas de miembros, cada nombre debe ser único. Un efecto secundario inevitable de IDispatch::GetIDsOfNames() . La función que el intérprete de guión usa para traducir "Escribir" como se usa en el código de guión a un dispid. El método aún existe, simplemente no hay forma de que GetIDsOfNames() devuelva su dispid. El exportador de biblioteca de tipos resuelve este problema al cambiar el nombre del método sobrecargado, será Write_2() .

Es en dos partes

  1. Explicando el comportamiento de IDispatch::GetIDsOfNames()
  2. Cómo resuelve el exportador de bibliotecas de tipos el problema de exclusividad.

No dice que no están disponibles; por el contrario, han sido renombrados para evitar la restricción de exclusividad que tiene IDispatch::GetIDsOfNames() al asignar DISPID al nombre del método.

Por lo tanto, las tres sobrecargas están disponibles y se han cambiado de nombre utilizando el siguiente formato

oList.IndexOf oList.IndexOf_2 oList.IndexOf_3

Nota: No hay IndexOf_1 porque la primera sobrecarga siempre toma el nombre del método original y las sobrecargas posteriores comienzan desde _2 adelante.

Dependiendo de cómo cambie el nombre del Exportador de Bibliotecas de Tipo, las sobrecargas dependerán de cuál tome qué conjunto de argumentos, la única manera de resolver esto es de prueba y error.

Intento rápido en una prueba

Dim oList Set oList = CreateObject("System.Collections.ArrayList") oList.Add "bar" oList.Add "foo" WScript.Echo oList.IndexOf("foo", 0) WScript.Echo oList.IndexOf_2("foo", 0, 1) WScript.Echo oList.IndexOf_3("foo")

Salida:

1 -1 1

¿Por qué las dos declaraciones fallan con diferentes errores?

Si volvemos a su ejemplo original

Dim oList Set oList = CreateObject("System.Collections.ArrayList") ''oList.IndexOf "foo" ''Error: Invalid procedure call or argument: ''IndexOf'' oList.IndexOf "foo", 0 ''oList.IndexOf "foo", 0, 1 ''Error: Wrong number of arguments or property assignment was not valid: ''IndexOf''

Los enunciados uno y tres fallan con diferentes errores debido a la forma en que VBScript evalúa las firmas de métodos. La firma correcta en el ejemplo anterior acepta dos argumentos, por lo que la primera declaración;

oList.IndexOf "foo"

fallará porque la única firma coincidente tiene dos argumentos, no uno, de ahí el error;

Llamada o argumento de procedimiento no válido: ''IndexOf''

La tercera declaración

oList.IndexOf "foo", 0, 1

contiene un argumento más que la firma esperada, por lo que, en lugar de no encontrar una coincidencia, encuentra uno, pero informa;

El número incorrecto de argumentos o la asignación de propiedades no era válido: ''IndexOf''

ya que el número de argumentos excede lo esperado por la firma del método IndexOf(arg, arg) .

Enlaces útiles

  • CA1402: Evite sobrecargas en las interfaces visibles COM (gracias a @Pikoh para este )

  • Determinación del número de sufijo del método .Net en VBScript (interoperabilidad COM)

  • Sobrecargas en interoperabilidad COM (CCW): los nombres IDispatch incluyen el sufijo (_2, _3, etc.)

  • ¿Hay alguna herramienta para explorar / probar objetos COM?