¿Realmente necesita esta palabra clave para sobrecargar métodos? ¿Cuál es la diferencia entre usar la palabra clave overloads y simplemente tener diferentes firmas de métodos?Palabra clave "Sobrecarga" en VB.NET
Respuesta
Dentro de la misma clase, la palabra clave Overloads
es opcional, pero si un método se declara Overloads
o Overrides
, debe usarlo para todas las sobrecargas de ese método.
' this is okay
Sub F1(s as String)
Sub F1(n as Integer)
' This is also okay
Overloads Sub F2(s as String)
Overloads Sub F2(n as Integer)
' Error
Overloads Sub F3(s as String)
Sub F3(n as Integer)
Sin embargo, se vuelve más complicado cuando se sobrecarga métodos de clase base en una clase derivada.
Si una clase base tiene varios métodos sobrecargados y desea agregar un método sobrecargado en una clase derivada, debe marcar el método en la clase derivada con la palabra clave Overloads
, de lo contrario, todos los métodos sobrecargados en la clase base no disponible en la clase derivada.
Ver MSDN para más detalles.
Fue una consideración de diseño. Por supuesto que (VB) podría haber sido diseñado para inferir sobrecarga por la firma de la función (como en C#), por lo que la palabra clave Overloads podría haberse omitido, pero al final está en línea con la expresividad de Visual Basic (que algunos consideran por encima) y fue solo una decisión de diseño del lenguaje.
OP pregunta por qué sobrecargar (frente a tener diferentes nombres para los métodos), no por qué usar palabra clave de sobrecarga. –
@Adrian Godong: OP pregunta si hay una necesidad de la palabra clave "Sobrecargas" en VB, no si la sobrecarga es útil (en lugar de simplemente usar diferentes nombres de método) –
@Adrian: Eso está mal - Pregunta acerca de la palabra clave – Dario
La clave Overloads
es completamente opcional, no veo ventajas en su uso.
OP pregunta por qué sobrecargar (frente a tener diferentes nombres para los métodos), no por qué usar palabra clave de sobrecarga. –
Eso está mal - Pregunta acerca de la palabra clave: No habla de nombres, sino de firmas, llamamos a eso sobrecargar – Dario
Miky D tiene razón. No hay diferencia entre un método sobrecargado declarado Overloads y otro que no lo hace.
Solo quería señalar que la palabra clave Sobrecarga es obligatoria cuando se declara Sobreescribe o Sobrecarga otro método con el mismo nombre. Por ejemplo, si se reemplaza el método Equals así:
Public Overrides Function Equals(ByVal obj As Object) As Boolean ...
entonces usted quiere crear una sobrecarga de la siguiente manera:
Public Function Equals(ByVal otherProduct As Product) As Boolean ...
obtendrá el siguiente error:
"function 'Equals' must be declared 'Overloads' because another 'Equals'
is declared 'Overloads' or 'Overrides'."
Obtendrá el mismo error si alguien declaró un método como Sobrecargas y desea sobrecargar ese método. Deberá agregar la palabra clave Sobrecarga a su método o eliminarla del otro método.
Personalmente nunca declaro un método sobrecargado Sobrecargas a menos que no tenga la opción, como en la situación anterior.
Me encontré con una situación en la que tenía que usar la palabra clave Sobrecarga.
Tenía una clase para padres y una clase heredada.
Public Class DataManager
Public MustOverride Function LoadDataSet(ByVal TableName as String, ByVal SQL as SQLObject) as DataSet
Public Function LoadDataSet(ByVal TableName as String, ByVal SQL as String) as DataSet
Return LoadDataSet(TableName, new SQLObject(SQL))
End Function
End Class
Public Class OracleDataManager
Inherits DataManager
Public Overloads Overrides Function LoadDataSet(ByVal TableName as String, ByVal SQLObj as SQLObject) as DataSet
// code here
End Function
End Class
En este ejemplo, tuve que usar la palabra clave de las sobrecargas.
Esto aparece alto en los resultados de Google, y creo que podría explicarse más claramente aquí.
No hay ninguna razón para usar la palabra clave Overloads
cuando está sobrecargando varios métodos dentro de la misma clase. La razón principal por la que usaría Overloads
es permitir que una clase derivada llame a un método de su clase base que tiene el mismo nombre que el método sobrecargado, pero con una firma diferente.
Supongamos que tiene dos clases, Foo
y SonOfFoo
, donde SonOfFoo
hereda de Foo
. Si Foo
implementa un método llamado DoSomething
y SonOfFoo
implementa el método con el mismo nombre, el método SonOfFoo
ocultará la implementación de la clase principal ... incluso si los dos métodos toman diferentes parámetros. Al especificar la palabra clave Overloads
, la clase derivada llamará a las sobrecargas de la clase padre del método.
Aquí hay algo de código para demostrar lo anterior, con las clases Foo
y SonOfFoo
implementadas como se ha descrito, y otro par de clases, Bar
y SonOfBar
que utilizan el Overloads
palabra clave:
Class Foo
Public Sub DoSomething(ByVal text As String)
Console.WriteLine("Foo did: " + text)
End Sub
End Class
Class SonOfFoo
Inherits Foo
Public Sub DoSomething(ByVal number As Integer)
Console.WriteLine("SonOfFoo did: " + number.ToString())
End Sub
End Class
Class Bar
Public Sub DoSomething(ByVal text As String)
Console.WriteLine("Bar did: " + text)
End Sub
End Class
Class SonOfBar
Inherits Bar
Public Overloads Sub DoSomething(ByVal number As Integer)
Console.WriteLine("SonOfBar did: " + number.ToString())
End Sub
End Class
Sub Main()
Dim fooInstance As Foo = New SonOfFoo()
'works
fooInstance.DoSomething("I'm really a SonOfFoo")
'compiler error, Foo.DoSomething has no overload for an integer
fooInstance.DoSomething(123)
Dim barInstance As Bar = New SonOfBar()
'works
barInstance.DoSomething("I'm really a SonOfBar")
'compiler error, Bar.DoSomething has no overload for an integer
barInstance.DoSomething(123)
Dim sonOfFooInstance As New SonOfFoo()
'compiler error, the base implementation of DoSomething is hidden and cannot be called
sonOfFooInstance.DoSomething("I'm really a SonOfFoo")
'works
sonOfFooInstance.DoSomething(123)
Dim sonOfBarInstance As New SonOfBar()
'works -- because we used the Overloads keyword
sonOfBarInstance.DoSomething("I'm really a SonOfBar")
'works
sonOfBarInstance.DoSomething(123)
End Sub
Aquí es some information sobre cómo se compila de manera diferente en la CLI.
Por lo tanto, el valor predeterminado es 'Sombras'. –
Debo ser la persona más olvidadiza del mundo; Vine aquí desde una búsqueda en Google y terminé golpeándome en la cara cuando vi mi propia respuesta. –
¿Qué hay de las funciones? ¿Podrías agregar algo? – beppe9000
- 1. Sobrecarga, inferencia de tipo genérico y la palabra clave 'params'
- 2. Usar la palabra clave Me (VB.NET) ¿es obligatorio o no?
- 3. ¿Agregar una palabra clave a VB.net? ("Existe" vs "IsNot Nada")
- 4. ¿Es la palabra clave 'Is' VB.NET lo mismo que Object.ReferenceEquals?
- 5. VB.NET equivalente a la palabra clave var C#
- 6. Comportamiento de la palabra clave VB.NET WithEvents: ¿restricción del compilador VB.NET?
- 7. "con la" palabra clave en javascript
- 8. palabra clave privada vs no palabra clave privada
- 9. qué debe proporcionarle la palabra clave const en el operador de sobrecarga
- 10. palabra clave estática en C#
- 11. Registro palabra clave en C++
- 12. palabra clave "agradable" en C++?
- 13. palabra clave foreach en java?
- 14. palabra clave 'fuera' en C++
- 15. palabra clave predeterminada en php
- 16. Palabra clave abstracta en PHP
- 17. palabra clave "nueva" en Scala
- 18. esta palabra clave en android
- 19. USO palabra clave en Mysql
- 20. Súper palabra clave en Ruby
- 21. palabra clave "exists" en Python?
- 22. ¿La palabra clave `overload` hace alguna diferencia?
- 23. Palabra clave protegida C#
- 24. anidada sincronizada palabra clave
- 25. Vim palabra clave Finalización
- 26. PHP palabra clave clon
- 27. F # palabra clave 'Algunos'
- 28. C# palabra clave virtual
- 29. equivalente volátil en VB.NET
- 30. Palabra clave reservada en la enumeración en C#
Ah, una de estas inútiles palabras clave de VB.NET como "Solo lectura" para una propiedad, "Opcional" para un parámetro opcional o "ByVal": D –
@RayKoopa ¡Sí! (pero "Opcional" no es opcional: D) – unnknown
Sí, por desgracia lo es. Mientras tanto, hablé con un diseñador de lenguaje VB en VS Uservoice, y el motivo para mantener estos requisitos es porque el lenguaje debe admitir el IDE para generar automáticamente stubs de propiedades u otras cosas (por ejemplo, solo un talón Get si escribe "ReadOnly"). De hecho, VB está diseñado para admitir el IDE, no es el IDE diseñado para admitir VB. ¡Extraño! –