2011-04-05 15 views
52

¿Cómo puedo utilizar constructores en C# como esto:C# constructores sobrecarga

public Point2D(double x, double y) 
{ 
    // ... Contracts ... 

    X = x; 
    Y = y; 
} 

public Point2D(Point2D point) 
{ 
    if (point == null) 
     ArgumentNullException("point"); 
    Contract.EndContractsBlock(); 

    this(point.X, point.Y); 
} 

lo necesito a no copiar código de otro constructor ...

Respuesta

55

Puede factorizar su lógica común a un método privado, por ejemplo llamado Initialize que recibe llamadas de ambos constructores.

Debido a que desea realizar la validación de argumentos no puede recurrir al encadenamiento de constructores.

Ejemplo:

public Point2D(double x, double y) 
{ 
    // Contracts 

    Initialize(x, y); 
} 

public Point2D(Point2D point) 
{ 
    if (point == null) 
     throw new ArgumentNullException("point"); 

    // Contracts 

    Initialize(point.X, point.Y); 
} 

private void Initialize(double x, double y) 
{ 
    X = x; 
    Y = y; 
} 
+13

Como ávido admirador de la inmutabilidad, me gustaría señalar que una desventaja de este método es que no puede inicializar campos de solo lectura :( –

+0

Estaba pensando en esta misma solución, y ahora ha confirmado que es una buena idea. Gracias:) – superiggy

+6

Pruebe primero la respuesta de Mark Cidade. Use esto como una alternativa. – gidmanma

144
public Point2D(Point2D point) : this(point.X, point.Y) { } 
+0

Quiero contratos de uso y nulo excepción si el punto es nulo –

+4

punto no puede ser nulo, ya que no se define como un tipo anulable (Point2D? Punto) – RvdK

+0

Describir lo que quiere decir con el uso de los contratos. La respuesta de Mark es correcta. – SQLMason

5

Tal vez su clase no es del todo completa. Personalmente, uso una función privada init() con todos mis constructores sobrecargados.

class Point2D { 

    double X, Y; 

    public Point2D(double x, double y) { 
    init(x, y); 
    } 

    public Point2D(Point2D point) { 
    if (point == null) 
     throw new ArgumentNullException("point"); 
    init(point.X, point.Y); 
    } 

    void init(double x, double y) { 
    // ... Contracts ... 
    X = x; 
    Y = y; 
    } 
}