2011-10-24 14 views
9

¿Cuáles son las diferencias de comportamiento para la propiedad Previous de Other1 y Other2 Clase.Sobrecargas y anulaciones en VB.net

Nota que el tipo de retorno de la sobrecarga Previous Propiedad de Other2 se ha cambiado a Other2 mientras se mantiene como Base para Other1.

Public Class Base 
    Private _Previous as Base 

    Protected Overridable ReadOnly Property Previous As Base 
     Get 
      Return _Previous 
     End Get 
    End Property 

    Public Sub New(Previous as Base) 
     _Previous = Previous 
    End Sub 
End Class 

Public Class Other1 
    Inherits Base 
    Private _Parent as SomeType 

    Protected Overrides ReadOnly Property Previous As Base 
     Get 
      Return _Parent.Previous.Something 
     End Get 
    End Property 

    Public Sub New(Parent as SomeType) 
     MyBase.New(Nothing) 
     _Parent = Parent 
    End Sub 
End Class 

Public Class Other2 
    Inherits Base 
    Private _Parent as SomeType 

    Protected Overloads ReadOnly Property Previous As Other2 
     Get 
      Return _Parent.Previous.Something 
     End Get 
    End Property 

    Public Sub New(Parent as SomeType) 
     MyBase.New(Nothing) 
     _Parent = Parent 
    End Sub 
End Class 

Respuesta

12

Después de uno de mi comentario a Jim Wooley's answer, "que parezca que las sombras la propiedad sobrecargada ". Vi la luz en this article.

Por lo tanto, las sobrecargas en la clase Other2 actúan un poco más como sombreado que. No es uno de los comments en el artículo que es particularmente instructivo: surge

La confusión porque la palabra clave "sobrecargas" no es lo que un programador de C# considera una sobrecarga en el sentido tradicional OO. Es un tipo de escondite que es específico de VB.Net. En realidad, puede cambiar la palabra clave SHADOWS con OVERLOADS en la mayoría de los casos, y el comportamiento es el mismo. La diferencia es cuando tienes una clase base con varias firmas de método sobrecargadas. Si declara un método en una subclase con un nombre coincidente y la palabra clave SHADOWS, ocultará CADA sobrecarga de ese método en la clase base. Si usa la palabra clave OVERLOADS, solo ocultará el método de clase base con una firma idéntica.

+0

Parece que la palabra clave 'Shadows' puede convertirse muy fácilmente en una grave violación de LSP. – Panzercrisis

2

En general, utilizará Sobrecargas cuando esté suministrando diferentes parámetros de entrada. Las anulaciones reemplazan la funcionalidad. En su caso, desea Anulaciones en Other2, no en Sobrecargas. Mientras que las propiedades pueden tener parámetros diferentes del valor, lo mejor es que no proporciona ellos y utilizar métodos en lugar de propiedades al pasar a otros valores:

Public Class OldMath 
    Public Overridable Function DoSomething(val1 As Integer) As Integer 
     Return val1 + val1 
    End Function 
End Class 

Public Class NewMath 
    Public Overrides Function DoSomething(val1 As Integer) As Integer 
     Return val1 * val1 
    End Function 
    Public Overloads Function DoSomething(val1 As Integer, val2 As Integer) As Integer 
     Return val1 * val2 
    End Function 
End Class 
+0

Entiendo que, pero las sobrecargas permiten la modificación del tipo de devolución a Other2, ¿se comportaría como la Proprity anulada cuando la referencia se declara como tipo base? – DavRob60

+0

Las anulaciones también se pueden usar para agregar funcionalidad además del método modificado. Muy a menudo, verá que un método anula un método base pero aún lo llama porque solo necesitaba agregar algunas cosas para la clase heredada. – Yatrix

+0

@ DavRob60 No puede sobrecargar el tipo de devolución, solo los parámetros de entrada. Si sus parámetros de entrada son diferentes y su tipo de devolución es diferente, el que se llamará se basará en la mejor coincidencia de los parámetros de llamada utilizando una convención de estrechamiento para determinar la mejor coincidencia. –