2011-02-01 29 views
10

Estoy escribiendo una clase abstracta con un método abstracto (por lo tanto, todas las clases que hereden de ella deben implementar ese método). Sin embargo, no quiero especificar los parámetros que el método debe usar, ya que cada método puede tomar diferentes o ningún parámetro. Solo el nombre y el valor de retorno deben ser iguales.Definir un método abstracto sin especificar los parámetros

¿Hay alguna manera de hacer esto en C#?

¡Gracias por cualquier ayuda!

Respuesta

16

No, y sería inútil hacerlo. Si no declara los parámetros, no podrá llamar al método dado solo a una referencia a la clase base. Ese es el punto de los métodos abstractos: permitir que las personas que llaman no se preocupen por la implementación concreta, sino darles una API para usar.

Si la persona que llama necesita conocer la firma exacta del método, entonces ha vinculado a la persona que llama a una implementación concreta, haciendo que la abstracción sea esencialmente inútil.

¿Tal vez si pudiera dar más detalles, podríamos sugerir un enfoque más apropiado? Por ejemplo, es posible que pueda hacer el tipo genérico:

public class Foo<T> 
{ 
    public abstract void Bar(T t); 
} 

subtipos de hormigón o bien podría también ser genéricos o derivar de Foo<string> por ejemplo.

+0

Cada niño debe crear una implementación de este método donde pueda tomar diferentes tipos de entrada, pero producirá el mismo tipo de salida. Por lo tanto, puedo usar la salida para realizar la lógica de mi programa. – TheBoss

+2

@TheBoss: El objetivo de las clases abstractas (como las interfaces) es permitir una ... buena ... extracción de la funcionalidad común. No puede usarlo para definir algo como "Necesita una función llamada' Foo' que toma * algunos * (o no) parámetros y devuelve un 'int'"; dicha función no puede abstraerse, ya que su firma no está definida. Sería imposible llamar (no reflexivamente) desde el código que hace referencia a la clase en un nivel más alto que donde se define la firma específica, rompiendo la abstracción. –

+0

@TheBoss: creo que deberías considerar el uso de genéricos para resolver tu desafío de diseño, como el ejemplo de código que publicó Jon. – code4life

0

No, no lo hay.

Para anular un método, debe coincidir con la firma del método. Esto incluye el nombre del método y los parámetros de formato.

1

Lo que estás tratando de hacer es un olor a código.

Un mejor patrón sería tener su clase abstracta implementar ISupportInitialize, y luego tener un método abstracto Act().

La idea es que entre las llamadas a BeginInit y EndInit es cuando los tipos de su hijo se preparan para actuar, juntando los diferentes bits de información que intenta agrupar en tipos aleatorios y números de argumentos. Una vez configurado, y se llama a EndInit (valide aquí) se puede llamar al resumen Act().

También, por favor, por favor no hacer esto:

public abstract void Act(params object[] arguments); 

La gente va a cazarte si haces algo como esto.

+0

Ese es un enfoque interesante. Entonces, tendría un campo booleano en la clase que indicaría cuándo se completó la inicialización, y solo entonces el método Act() se ejecutará correctamente; de ​​lo contrario, arrojaría una excepción. – TheBoss

+0

@TheBoss la técnica estándar es verificar el estado de la instancia en EndInit y lanzar si no está en un estado correcto. Los tipos que implementan esta interfaz a menudo se vuelven inmutables después de una llamada a EndInit. – Will

Cuestiones relacionadas