2011-01-29 11 views
8

¿Es posible crear una clase base como la siguiente:¿Es posible hacer que la lista de parámetros de un método abstracto tenga una longitud y tipos anulables?

public abstract class baseClass 
{ 
    public abstract void SetParameters(/*want this to be adjustable*/); 
} 

para que las clases que anulan puede definir los parámetros necesarios? En otras palabras, quiero forzar el método a ser anulado, pero dejar en manos de la clase predominante lo que se requiere aquí - por lo que uno podría ser

public class derivedClass1 : baseClass 
{ 
    public override void SetParameters(Point a, int b); 
} 

mientras que otro podría ser

public class derivedClass2 : baseClass 
{ 
    public override void SetParameters(List<Line> a, Point b, Point c, bool e); 
} 

?

Gracias por cualquier ayuda que puede dar

+0

¿Quisiste decir 'public class derivedClass: baseClass' en los dos últimos ejemplos? –

+0

Lo siento, sí. Voy a cambiar ese – simonalexander2005

Respuesta

10

Por supuesto que no - que romperían la mitad el punto de tener el método abstracto en el primer lugar - que nadie sería capaz de llamarlo, porque no sabrían qué firma de método realmente se había escrito. El objetivo de una clase abstracta es que un cliente puede tener una referencia del tipo BaseClass sin preocuparse por el tipo de implementación real.

Si la clase base es capaz de predecir con anticipación qué tipos pueden estar involucrados, una posibilidad de hacer la vida más fácil para la persona que llama es tener la firma más general (generalmente la que tiene la mayoría de los parámetros) abstracta, y hacer varias sobrecargas que llama al que generalmente proporciona los valores predeterminados para los parámetros que el cliente no ha especificado.

0

No, esto no es posible. Un método primordial debe coincidir exactamente con los parámetros; es lo mismo que implementar una interfaz. Puede estar interesado en el patrón double-dispatch.

+0

El enlace que dio parece hacerlo por un parámetro de tipo variable (en cuyo caso también puede usar ?) - pero no para un número variable de parámetros de tipo variable ... o estoy leyendo mal ¿eso? – simonalexander2005

+0

Debería cambiar el ejemplo para acomodar una lista de parámetros 'params object [] args'. –

0

Se puede hacer SI los parámetros estaban todos configurados en el mismo tipo y en el mismo número, supongo (no estoy seguro si puede usar params T [], pero si es posible, entonces puede ajustarlo también). Se puede lograr mediante el uso de los genéricos, como @ simonalexander2005 dijo

public abstract class baseClass<T> where T : class 
{ 
    public abstract T SetParameters(params T[] parameters); 
} 

su hasta usted para decidir cuántos parámetros utilizará la clase derivada. Pero, no estoy seguro si es una buena práctica ...

Cuestiones relacionadas