2008-10-01 11 views
6

¿Cuál es un uso realista para la palabra clave MyClass de VB.Net?MyClass en VB.Net

Entiendo technical usage of MyClass; No entiendo su uso práctico en el mundo real.

El uso de MyClass solo tiene sentido si tiene miembros virtuales (anulables). Pero también significa que desea ignorar las implementaciones anuladas en las subclases. Parece ser autocontradictorio.

Puedo pensar en algunos ejemplos artificiales, pero son simplemente mal diseño en lugar de uso práctico.

Respuesta

1

MyClass, desde la perspectiva de un compilador, es una manera de omitir una instrucción callvirt a favor de una instrucción de call. Básicamente, cuando llamas a un método con la semántica virtual (callvirt), estás indicando que quieres usar la variación más derivada. En los casos en que desee omitir las variaciones derivadas, utilice MyClass (call). Si bien has declarado que entiendes el concepto básico, pensé que podría ser útil describirlo desde un punto de vista funcional, en lugar de entenderlo implícitamente. Es funcionalmente idéntico a MyBase con la advertencia del alcance que es tipo de base con MyBase, en lugar del tipo activo con MyClass.

Anular la semántica de llamadas virtuales, en el punto actual de la jerarquía, suele ser una mala opción de diseño, las únicas veces que es válido es cuando debe confiar en una pieza específica de la jerarquía de objetos y no puede confíe en el heredero para llamar su variación a través de una invocación base en su implementación. También podría confiar en que como diseñador decidirá que es la única alternativa, ya que anulará la funcionalidad más allá en la jerarquía de objetos y debe asegurarse de que en este caso de esquina este método específico, en el nivel actual del árbol de herencia, debe ser llamado.

Se trata de diseño, entendiendo el diseño general y las fundas de esquina. Es probable que haya una razón por la cual C ♯ no incluye dicha funcionalidad, ya que en esos casos de esquina puede separar el método en una variación privada que invoca el nivel actual en la jerarquía, y solo hacer referencia a esa implementación privada cuando sea necesario.Es mi opinión personal que utilizar el enfoque de segmentación es el medio ideal para un fin, ya que es explícito sobre su elección de diseño y es más fácil de seguir (y también es el único válido significa en idiomas sin un equivalente funcional a MyClass.)

+0

Gracias por responder mi pregunta de 5 años :) Creo que "la elección del mal diseño" es la respuesta; privado sellado/público virtual parece mucho mejor. –

+0

@RobertTaylor: Me alegro de poder ayudar. Me sorprendió la falta de una respuesta clara, así que pensé que respondería desde la perspectiva de un escritor de compilación. Todavía estoy aprendiéndome a mí mismo, pero eso no significa que lo poco que sé no sea útil. –

-1

Supongo que el único caso que podría verle un uso sería si desea la condición base y una condición heredada al mismo tiempo. ES DECIR. donde desea poder heredar un miembro, pero desea la capacidad de acceder a un valor para ese miembro que no ha sido cambiado por herencia?

+0

entonces, ¿por qué permitir que ese miembro sea anulado en primer lugar? –

1

polimorfismo

Lo siento, no tengo un ejemplo de código claro aquí, pero se puede seguir el siguiente enlace para ese y no me gusta copiar la descripción de MSDN pero es tan bueno que es muy difícil reescribirlo de forma más clara.

"MyClass proporciona una forma de referirse a los miembros actuales de la instancia de clase sin que sean reemplazados por anulaciones de clase derivadas. La palabra clave MyClass se comporta como una variable de objeto que hace referencia a la instancia actual de una clase originalmente implementada."

También tenga en cuenta que no puede usar MyClass en un método compartido.

Un buen ejemplo de la aplicación de polimorfismo a través de miclase en http://www.devarticles.com/c/a/VB.Net/Implementing-Polymorphism-in-VB.Net/

+0

Has citado "MyClass proporciona una forma de hacer referencia a los miembros actuales de la instancia de clase sin que sean reemplazados por anulaciones de clase derivadas". Entonces, ¿por qué marcar a sus miembros como anulables en primer lugar? –

-3

Lo necesita si desea llamar a un constructor encadenado.

Public Sub New(ByVal accountKey As Integer) 
    MyClass.New(accountKey, Nothing) 
End Sub 

Public Sub New(ByVal accountKey As Integer, ByVal accountName As String) 
    MyClass.New(accountKey, accountName, Nothing) 
End Sub 

Public Sub New(ByVal accountKey As Integer, ByVal accountName As String, ByVal accountNumber As String) 
    m_AccountKey = accountKey 
    m_AccountName = accountName 
    m_AccountNumber = accountNumber 
End Sub 
+0

No; Me.New (...) o MyBase.New (...) funcionará bien. –