2009-03-11 7 views
5

tengo esto en mi clase base:Cómo reemplazar un método de clase de base y añadir un parámetro

protected abstract XmlDocument CreateRequestXML(); 

Trato de anular esta en mi clase derivada:

protected override XmlDocument CreateRequestXML(int somevalue) 
{ 
    ...rest of code 
} 

Sé que esto es una pregunta fácil pero porque he introducido un param es ese el problema? El hecho es que algunas de las clases derivadas pueden tener params o no en su implementación.

Respuesta

11

Cuando anula un método, con la excepción de la anulación de palabra en lugar de virtual o abstracto, debe tener la misma firma exacta que el método original.

Lo que ha hecho aquí es crear un nuevo método no relacionado. No es posible introducir un parámetro y aún anularlo.

+0

Ok, entonces digamos que quiere asegurarse de que cada clase que herede esta clase base sea requerida para implementar ese método. Pero usted sabe que en algunos casos habrá algunos parámetros necesarios para ese método y otros no. ¿Y que? ¿No necesita params y obtenerlos a través de un campo priv? – user72603

+0

Por lo tanto, quiere que las subclases implementen el método protegido y en algunas subclases desea que se requieran params a veces porque el parámetro se basa en ellas y en otros casos puede que no. Si el método no está destinado a ser consumido públicamente, podría obtenerlo de miembros privados de la clase ... ¿es eso típico? – user72603

+1

Estoy tratando de averiguar (mejor práctica) cuándo es mejor dejar un método protegido o incluso privado sin parámetros y solo obtener lo que necesita de los campos privados – user72603

0

Sí, el parámetro es el problema, la firma del método debe coincidir exactamente (eso incluye el valor devuelto y los parámetros).

2

Si algunas de las clases derivadas necesitan parámetros y otras no, debe tener dos versiones sobrecargadas del método. Entonces, cada clase derivada puede anular la que necesita.

class Foo {  
    protected abstract XmlDocument CreateRequestXML(int somevalue); 
    protected abstract XmlDocument CreateRequestXML(); 
}; 

class Bar : public Foo {  
    protected override XmlDocument CreateRequestXML(int somevalue) { ... }; 
    protected override XmlDocument CreateRequestXML() 
     { CreateRequestXML(defaultInt); } 
}; 

Por supuesto, esto presenta un problema del usuario que llama la equivocada. Si no existe un valor predeterminado aceptable para el parámetro adicional, es posible que deba lanzar una excepción en la clase derivada si se llama a la versión incorrecta.

0

Tengo mucha curiosidad por lo que está tratando de lograr con este código.

Normalmente se define una función abstracta cuando una clase de uso conoce su firma. La clase de uso tiene un "contrato" con su clase base.

Cuando desee derivar de la clase base y agregar parámetros adicionales, ¿cómo sabe la clase de uso a qué llamar en la clase base de todos modos?

Parece un defecto arquitectónico .... pero tal vez pueda agregar algo de información adicional al tema inicial.

Cuestiones relacionadas