2010-05-17 49 views

Respuesta

25

MyBase se usa cuando una función virtual necesita llamar a la versión principal. Por ejemplo, considere:

Class Button 
    Public Overridable Sub Paint() 
     ' Paint button here. ' 
    End Sub 
End Class 

Class ButtonWithFancyBanner 
    Inherits Button 

    Public Overrides Sub Paint() 
     ' First, paint the button. ' 
     MyBase.Paint() 
     ' Now, paint the banner. … ' 
    End Sub 
End Class 

(Esto es lo mismo que base en C#.)


MyClass se usa raramente en absoluto. Se llama al método de la clase propia, aunque por lo general se llama método virtual de la clase derivada . En otras palabras, disuelve el envío de métodos virtuales y en su lugar realiza una llamada estática.

Este es un ejemplo artificial. Estoy en apuros para encontrar un uso real ahora (aunque eso ciertamente existe):

Class Base 
    Public Overridable Sub PrintName() 
     Console.WriteLine("I’m Base") 
    End Sub 

    Public Sub ReallyPrintMyName() 
     MyClass.PrintName() 
    End Sub 
End Class 

Class Derived 
    Inherits Base 
    Public Overrides Sub PrintName() 
     Console.WriteLine("I’m Derived") 
    End Sub 
End Class 

' … Usage: ' 

Dim b As Base = New Derived() 
b.PrintName()   ' Prints "I’m Derived" ' 
b.ReallyPrintMyName() ' Prints "I’m Base" ' 

(Esto no existe en C# En IL, este emite un call en lugar del habitual callvirt código de operación. .)

6

Ambos se utilizan cuando es necesario llamar a un método virtual y es necesario especificar cuál. MyBase llamará al método en la clase base, MyClass llamará al método en la clase actual.

No creo que haya usado MyClass más de una o dos veces, pero MyBase He usado bastante cuando invalido un método pero también quiero que se ejecute el código en el método reemplazado.

MyBase:

http://msdn.microsoft.com/en-us/library/dzfhkk01%28VS.71%29.aspx

MyClass:

http://msdn.microsoft.com/en-us/library/b3b35kyk%28VS.71%29.aspx

2

mybase se refiere a la clase base inmediata de la instancia actual.

myclass se refiere a la instancia actual, pero ignora cualquier implementación reemplazado de las propiedades/métodos de la clase.

En pocas palabras, el uso total de ambos es para Polymorphism. Aquí hay un buen article que explica las palabras clave un poco más.

0

Estas palabras clave se utilizan en casos relacionados con sucesiones. MyBase, MyClass a menudo se usan para referirse a alguna funcionalidad o propiedad en la clase principal. Si tiene una clase que se deriva de otra, esas palabras clave se utilizan para hacer referencia al código en el contexto de la clase principal.

1

En cuanto al uso de MyClass, hay una mejora de velocidad muy pequeña si usa MyClass dentro de una clase hoja (clase NotInheritable).Específicamente, si hay algún método que existe en una clase padre y no se reemplaza O existe como una anulación en la clase hoja, entonces usando MyClass en lugar de Me se usa un código de operación call en lugar de callvirt.

MyBase, que también emite el código de operación call, no es aplicable en este caso donde desea que se invoque el método, independientemente de si está implementado/anulado en la hoja o solo existente en el elemento primario. Es decir, mantiene una forma de consistencia de estilo entre una gran cantidad de objetos similares.

Y cuando digo "mejora de velocidad", estoy hablando de unos mínimos de 5ms de 100.000 ejecuciones en un servidor de desarrollo de gama baja que se ejecuta en modo de 32 bits, en una función de análisis de cadenas. O para decirlo de otra manera, cuanto más rápida sea la máquina, más pequeña será esta diferencia. Pero, quería ponerlo allí.

Cuestiones relacionadas