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
.)
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. –
@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. –