2012-03-02 13 views
6

Por lo tanto, en la escuela tenemos una tarea para hacer un automóvil en OOP, hasta ahora ha sido bastante fácil y directo. Pero ahora necesito crear cuatro constructores, uno sin parámetros, dos con un parámetro y uno con dos parámetros.Múltiples constructores con un parámetro

Por lo que yo sé, la forma en que funciona la sobrecarga es que comprueba la cantidad de parámetros que usted le proporciona y luego verifica qué constituyente debe usar. Como dos de los constructores son iguales, ambos aceptan enteros, solo uno necesita cambiar la cantidad o engranajes, y el otro necesita cambiar la velocidad máxima.

¿Hay alguna manera de hacer esto sin pasar un parámetro adicional?

+0

Creo que leyó mal la tarea: ¿por qué pasaría la cantidad de engranajes (un número) o la velocidad máxima (también un número) como una cadena? Pero esta observación no necesariamente resuelve el problema. Su duda es esencialmente correcta: es cuestionable si un buen diseño de OOP usaría constructores aquí. –

+0

¿Tu * tarea * es usar constructores, o es * tu forma de resolver * la tarea en particular? –

+0

Suena así podría causar ambigüedad. No estoy seguro de que esto sea posible. –

Respuesta

12

Por lo que sé, la forma en que funciona la sobrecarga es que comprueba la cantidad de parámetros que usted proporciona y luego verifica qué constructor debe usar.

No, la sobrecarga no se basa únicamente en el número de parámetros - que se basa en sus tipos también.

Sin embargo:

Como dos de los constructores son los mismos, tanto acepta cadenas

eso es un problema. No se puede declarar dos constructores de esta manera:

public Foo(string x) 
{ 
} 

public Foo(string y) 
{ 
} 

Esas firmas chocan en lo que se refiere a la sobrecarga.

Yo sugeriría tener métodos de fábrica públicas estáticas, lo que permite indicar lo que está tratando de crear:

public static Foo FromGears(string gears) 
{ 
    return new Foo(...); 
} 

public static Foo FromMaximumSpeed(string maxSpeed) 
{ 
    return new Foo(...); 
} 

Se podría entonces posiblemente tiene un constructor que aceptó ambos valores, y predeterminado cualquiera que falta cuando llama al constructor desde el método de fábrica.

Sin embargo, hay otros dos rarezas en su descripción:

  • Estás usando cuerdas para dos valores que suenan como deberían ser números (o posiblemente un número, y un número- y-unidad)
  • Está hablando de declarar constructores, pero luego usa la palabra "cambiar" como si fuera a cambiar una instancia existente. Eso no tiene sentido: los constructores se usan para crear nuevos objetos.

EDIT: Bueno, ahora sabemos un poco más, aquí es el tipo de cosas que quiero decir:

public class Car 
{ 
    private const int DefaultGears = 5; 
    private const int DefaultTopSpeed = 180; 

    private readonly int gears; 
    private readonly int topSpeed; 

    public Car(int gears, int topSpeed) 
    { 
     this.gears = gears; 
     this.topSpeed = topSpeed; 
    } 

    public static Car CreateWithGears(int gears) 
    { 
     return new Car(gears, DefaultTopSpeed); 
    } 

    public static Car CreateWithTopSpeed(int topSpeed) 
    { 
     return new Car(topSpeed, DefaultGears); 
    } 
} 

Tenga en cuenta que podía parámetros uso opcionales y argumentos con nombre para esto también en C# 4 :

public class Car 
{ 
    public const int DefaultGears = 5; 
    public const int DefaultTopSpeed = 180; 

    private readonly int gears; 
    private readonly int topSpeed; 

    public Car(int gears = DefaultGears, int topSpeed = DefaultTopSpeed) 
    { 
     this.gears = gears; 
     this.topSpeed = topSpeed; 
    } 
} 

continuación:

Car car = new Car(gears: 4); 
Car car = new Car(topSpeed: 30); 

No lo recomendaría en general, sin embargo, no mientras usted todavía es relativamente nuevo en el lenguaje. Hay varias sutilezas alrededor de los parámetros opcionales.

+0

Ye, quise decir números, mi mal. La idea es crear un constructor predeterminado que haga que la velocidad máxima del automóvil sea de 180 km/hy tenga 5 velocidades. de lo que necesito otro constuctor que tenga un parámetro que cambie la cantidad de engranajes y otro contructor que cambie la velocidad máxima con un parámetro. Por alguna razón, necesito hacer estos constructores, y no usarlos como métodos. – Gideon

+2

@Gideon: Llamar a ese "cambio" de la velocidad máxima es un poco confuso: * especifica * la velocidad máxima. ¡No puedes cambiar algo que aún no existe! Aún así, parece que el resto de mi respuesta es apropiada. –

+0

Si usaría el método de métodos estáticos de fábrica. ¿Esto solo cambia la cantidad de un entero después de que el objeto ha sido creado? Si es así, eso es lo que uso ahora. – Gideon

1

Los métodos sobrecargados (y los constructores) deben diferir en su firma. Esto significa que deben tener un número diferente de parámetros o parámetros que tienen un tipo diferente (o ambos). Los nombres de los parámetros no se tienen en cuenta. Esto significa que no puede tener dos constructores que tengan un solo parámetro de cadena.

Los constructores no están hechos para cambiar nada más que para inicializar un objeto. Si desea cambiar un valor, considere agregar un método como ChangeGears(string gears).

1

En resumen, no. Los constructores no solo dependen del número de parámetros sino también de sus tipos.

public Car(string gears) 
{ 

} 

public Car(string maxSpeed) 
{ 

} 

no puede llamar a eso, porque son esencialmente el mismo constructor, pensar en ello, cuando se pasa de una serie, es un valor que está de paso, por lo que el compilador no tiene idea de lo que el constructor para usar: si quisiera establecer el número de marchas a 6 o la velocidad máxima a 6, la llamada seguiría siendo new Car("6"), un poco ambigua, ¿no cree?

La especificación de deberes no puede decir tener dos constructores que toman cadenas, ya que esto es imposible. Realmente, la única manera sensata de lograr esto sería usar métodos de fábrica estáticos o, como dijiste, introducir otro parámetro.

Ver lo que ha comentado en otras respuestas me lleva a creer que algo así podría funcionar para usted, sin embargo, es difícil saber exactamente lo que su tarea desea.

public Car() 
{ 
    ... // Do your setting of your default values here (# of gears, max speed) 
} 

public Car(int n) 
{ 
    if(n > 10) 
    { 
     // Use n to set your max speed 
    } else { 
     // Use n to set your # of gears 
    } 
} 

Parece poco probable que un coche va a poseer más de 10 engranajes, o que su velocidad máxima será de menos de 10, por lo que de esta manera se puede utilizar un solo constructor para establecer tanto su # de engranajes y la parte superior velocidad. (Tenga en cuenta lo que ha pedido que esto probablemente no responda a su tarea, pero sería una manera suficiente de IMO para usar un constructor que pueda establecer la velocidad máxima y el número de marchas sin agregar otro parámetro, suponiendo que tenga algún tipo de garantía de que la velocidad máxima es de coches> = 10 y el número de marchas es < 10)

+0

Entonces, solo tendría que hacer un engranaje int privado = 5; por defecto en el constructor, y hacer una función que cambie eso? Porque eso es lo que tengo ahora. Tal vez es un error en la descripción. – Gideon

+0

@Gideon Editado para reflejar una idea, tenga en cuenta que probablemente no sea suficiente para responder a su tarea. – NominSim

0
public Car(string param, bool isGear) 
{ 
    if(isGear) 
     gears = param; 
    else 
     maxSpeed = param; 
} 
+0

Estaba pensando esto, pero la idea es pasar solo 1 parámetro, y de esta manera, es 2. – Gideon

1

Cada método (incluyendo constructores) tiene una firma . La firma se compone del parámetro Tipos y su orden . No puede tener dos métodos que comparten el mismo nombre y firma.

Supongo que el requisito de que los parámetros sean cadenas es un malentendido.En ese caso, supongo que el número de engranajes siempre es un número entero, mejor representado como un número entero. Y la velocidad máxima puede ser un valor fraccionario, posiblemente un doble o flotante.

public class Car 
{ 
    public Car(int gears) {} 
    public Car(float maxSpeed) {} 
} 
Cuestiones relacionadas