2009-10-27 10 views
7

Nunca he estado preparado para esta pregunta: ¿pero sería un crimen terrible llamar a base.SomeMethod() condicionalmente en un método reemplazado?Llamar condicionalmente a un método básico anulado en C#

Ejemplo como en:

protected override void SomeMethod() 
{ 
    if(condition > 0) 
     base.SuperMethod(); 
} 

Soy consciente de que esto puede ser considerado una mala práctica, pero he hecho nunca leyó tal demanda hasta el momento.

Respuesta

10

No puedo pensar en una razón por la que esto sería malo en mi cabeza.

Sería mucho peor anular el método base y copiar la funcionalidad del método base para llamar condicionalmente en lugar de simplemente llamar al método base.

7
class HardHearingPerson : Person 
{ 
    override void Listen() 
    { 
    if (volume.Acceptable()) 
     base.Listen(); 
    } 
} 

Supongo que depende del contexto, pero estoy seguro de que podría haber justificado el uso.

2

Hago esto bastante a menudo. Cada vez que necesito "hacer algo más" en un método lo sobreescribo e invoco el método base (o viceversa)

+0

¿Te estás perdiendo la parte 'condicionalmente'? – leppie

+0

@leppie: No. El "hacer algo más" puede incluir condicionales – Sergio

1

Creo que es totalmente aceptable. Puede querer anular el comportamiento de un método de clase base solo bajo ciertas circunstancias, o extender el comportamiento llamando al método base y luego haciendo lo suyo.

+0

Eso podría justificar otra clase (especialización) :) – leppie

+0

@leppie - ¿no hereda un recuento de clases como la creación de otra clase? Tome este ejemplo: clase CSharpProgrammer hereda la clase Programador ... CSharpProgrammer es una clase especializada basada en el Programador. –

1

Las clases deben ser designed for inheritance:

Si la clase base está diseñado de una manera en llamar versiones base de ciertos métodos es opcional entonces está bien para omitir esas llamadas.

Si la clase base está diseñada de manera que DEBEN llamarse las versiones base, no está bien omitirlas.

El discutir si esto es una "buena práctica" pierde el sentido, en mi opinión. La forma en que una clase está estructurada para la herencia se basa en su propósito y diseño. La decisión de si le MAYO o MUST versiones base llamada de un método forma parte de las clases de interfaz pública , con respecto a la herencia.

No puede decidir cuándo será deseable o no deseable llamar a un método de clase base cuando anula sin entender cómo está diseñada la clase base y para qué sirve cada método.

+1

Esta es la razón por la cual 'sellado' debe ser el valor predeterminado en C#; o al menos, ser capaz de poner 'base' donde puede poner' sellado'. –

Cuestiones relacionadas