2011-01-18 7 views
24

Al usar algunos framework/api, a veces no está claro si debe invocar base.Method si lo reemplaza, por ejemplo, puede estar bastante seguro de que debe llamar a base.Maethod() cuando está invalidando event invocater, propagar el evento, en otras situaciones puede no ser tan claro, especialmente cuando no hay un código fuente disponible, y no hay comentarios.¿Cuándo debería llamar a base.Method() en el método reemplazado, y cómo marcar esto cuando escribe código en el equipo?

Me pregunto cómo otros programadores deciden si deben llamar al método básico o no en esta situación, y si está por escribir algún marco, informe a otros programadores que espera que se invoque el método base o no en los miembros virtuales.

Respuesta

7

Depende de si se necesita utilizar la funcionalidad subyacente.

Por ejemplo, si el objeto base tiene alguna funcionalidad de base de datos genérica que necesita ejecutarse, llame al método base al final. Si su código sobrescribe algunas de las propiedades que establecerá el método base, primero llame al método base.

Si no hay un código fuente o documentación, RedGate .Net Reflector (http://www.red-gate.com/products/dotnet-development/reflector/) puede simplemente descomprimir los ensamblajes que está tratando de usar y puedes ver cómo funciona el código.

+2

[dotPeek] (http://www.jetbrains.com/decompiler/) sería una alternativa libre al reflector .NET de Redgate (que es mejor también imo, tengo ambos y me encuentro sólo con dotPeek) . – MasterMastic

9

Si está requiriendo que los consumidores de su clase DEBEN implementar la funcionalidad de un método en particular, ese método se debe marcar como abstracto.

Si los consumidores de su clase deben proporcionar opcionalmente la funcionalidad de un método en particular, ese método debe ser virtual.

Realmente no hay forma de exigir que un consumidor de una clase llame a base.Method() en un método virtual. Realmente depende del contexto. Si el método base.Method() hace algún trabajo que de otro modo tendrías que hacer, te convendría llamar a base.Method() si eso te ayudara a ahorrar algo de tiempo de desarrollo/tiene sentido en ese contexto.

+0

Estoy votando esto porque, en mi experiencia, rara vez uso clases abstractas en mis propios proyectos, pero esto da un ejemplo muy claro de cuándo usarlos. –

18

Actualmente, no creo que los usuarios de una clase que anule un método deban llamar al método base.Method(). El código debe escribirse de tal manera que no se pueda romper.

public class MyBase 
{ 
    private void FooInternal() 
    { 
     DoRequiredStuff(); 
     Foo(); 
    } 
    public virtual void Foo() {} 
} 
Cuestiones relacionadas