2009-07-16 8 views
2

Je ne veux pas répliquer le code à travers les constructeurs surchargés comme ci-dessous. Comment puis-je le refactoriser?Comment refactoriser ces constructeurs de classes surchargés? (C#)

/// <summary> 
/// Represents a pseudo-random number generator, a device that 
/// produces a sequence of numbers that are normally distributed. 
/// </summary> 
public class NormalDeviate : UniformDeviate 
{ 
    double mean; 
    double standardDeviation; 
    double storedValue = 0d; 

    /// <summary> 
    /// Initializes a new instance of the <see cref="NormalDeviate"/> class. 
    /// </summary> 
    /// <param name="mean">The mean.</param> 
    /// <param name="standardDeviation">The standard deviation.</param> 
    /// <param name="seed">The seed.</param> 
    public NormalDeviate(double mean, double standardDeviation, ulong seed) 
     : base(seed) 
    { 
     this.mean = mean; 
     this.standardDeviation = standardDeviation; 
    } 

    /// <summary> 
    /// Initializes a new instance of the <see cref="NormalDeviate"/> class. 
    /// </summary> 
    /// <param name="mean">The mean.</param> 
    /// <param name="standardDeviation">The standard deviation.</param> 
    public NormalDeviate(double mean, double standardDeviation) 
     : base() 
    { 
     this.mean = mean; 
     this.standardDeviation = standardDeviation; 
    } 
} 

Répondre

2

Étant donné que vous ne pouvez pas nourrir le constructeur de base une graine 0 quand aucune graine n'est fournie, ce serait ce que vous voulez:

/// <summary> 
/// Represents a pseudo-random number generator, a device that 
/// produces a sequence of numbers that are normally distributed. 
/// </summary> 
public class NormalDeviate : UniformDeviate 
{ 
    double mean; 
    double standardDeviation; 
    double storedValue = 0d; 

    /// <summary> 
    /// Initializes a new instance of the <see cref="NormalDeviate"/> class. 
    /// </summary> 
    /// <param name="mean">The mean.</param> 
    /// <param name="standardDeviation">The standard deviation.</param> 
    /// <param name="seed">The seed.</param> 
    public NormalDeviate(double mean, double standardDeviation, ulong seed) 
     : base(seed) 
    { 
     CommonInitialization(mean, standardDeviation); 
    } 

    /// <summary> 
    /// Initializes a new instance of the <see cref="NormalDeviate"/> class. 
    /// </summary> 
    /// <param name="mean">The mean.</param> 
    /// <param name="standardDeviation">The standard deviation.</param> 
    public NormalDeviate(double mean, double standardDeviation) 
     : base() 
    { 
     CommonInitialization(mean, standardDeviation); 
    } 

    private void CommonInitialization(double mean, double standardDeviation) 
    { 
     this.mean = mean; 
     this.standardDeviation = standardDeviation; 
    } 
} 
0

Que pensez-vous de cela?

public class NormalDeviate : UniformDeviate 
{ 
    double mean; 
    double standardDeviation; 
    double storedValue; 

    /// <summary> 
    /// Initializes a new instance of the <see cref="NormalDeviate"/> class. 
    /// </summary> 
    /// <param name="mean">The mean.</param> 
    /// <param name="standardDeviation">The standard deviation. The distance from the mean where 78.2% of the samples lie.</param> 
    /// <param name="seed">The seed.</param> 
    public NormalDeviate(double mean, double standardDeviation, ulong seed) : base(seed) 
    { 
     this.mean = mean; 
     this.standardDeviation = standardDeviation; 
     this.storedValue = 0d; 
    } 

    /// <summary> 
    /// Initializes a new instance of the <see cref="NormalDeviate"/> class. 
    /// </summary> 
    /// <param name="mean">The mean.</param> 
    /// <param name="standardDeviation">The standard deviation. The distance from the mean where 78.2% of the samples lie.</param> 
    public NormalDeviate(double mean, double standardDeviation) 
     : this(mean, standardDeviation, 0) 
    { 

    } 
} 

EDIT: Code fixe

+0

Votre exemple fournit deux des mêmes constructeurs à trois paramètres et manque le constructeur à deux paramètres. – jasonh

+0

Mon mauvais. Correction du code. Merci d'avoir signalé mon erreur. – SolutionYogi

+0

Votre exemple envoie le paramètre 0 au constructeur de base, ce qui n'est pas exactement la même chose que l'appeler avec 0 paramètres. –

1
public ClassName(double arg1, double arg2, double arg3) : base(arg3) 
{ 
    _member1 = arg1; 
    _member2 = arg2; 
} 
public ClassName(double arg1, double arg2) : this(arg1,arg2,0) { } 
public ClassName(double arg1) : this(arg1,0,0) { } 
+0

C'est incorrect. Le zéro codé en dur atteindra le constructeur de base. –

+0

@ [Jader Dias]: c'est juste un exemple. utiliser NaN ou tout autre défaut est approprié pour les valeurs non spécifiées –

+0

@ [Jader Dias]: dans votre exemple, la valeur de la graine ulong est par défaut zéro si elle n'est pas spécifiée ;-) –

Questions connexes