Tworzenie obiektu i zastosowanie wzorca projektowego

0

Dzisiaj mam pewnie proste pytanie. Załóżmy mamy klasę z czterema właściwościami

class SomeClass{

          public double A {get; set;}
          public double B {get; set;}
          public double C {get; set;}
          public double D {get; set;}
}

Problem: chciałbym aby można było tworzyć obiekt albo z A,B,C albo A,B,D. Wszystkie właściwości są tego samego typu. Pierwsze rozwiązanie jakie mi przychodzi do głowy to użycie jakieś flagi w konstruktorze:

//deklaracja flagi poza klasą
enum SomeClassFlag {
        
    ABC,
    ABD

}

//i konstruktor klasy SomeClass:

public SomeClass(double value1, double value2, double value3, SomeClassFlag flag){
          
            this.A = value1;
            this.B = value2;
            if(flag ==  SomeClassFlag.ABC){
                      this.C = value3;
            } else {
                      this.D = value3;
            }
               
}

Wydaje mi się to słabe i mało eleganckie rozwiązanie. Kolejne również chyba mało eleganckie rozwiązanie to z nullable types:


//konstruktor klasy SomeClass:
public SomeClass(double value1, double value2, double? value3, double? value4){
            
            if(value3.HasValue && value4.HasValue)
                throw new System.ArgumentException("wyjatek..");
                      
            this.A = value1;
            this.B = value2;
            if(value3.HasValue) { 
                      this.C = value3.Value
            } else {
                     this.D = value3.Value;
           }
         

}

//przykladowe tworzenie obiektu z parametrami ABC:

new SomeClass(1.0,2.0,3.0, null);

Oba rozwiązania powyższe rozwiązania wydają mi się... prymitywne.

Czy istnieje jakiś wzorzec, który należałoby stosować w takim przypadku?

2

Tworzenie enuma, żeby wywołać konstruktor zalatuje małym WTF. Z nullable nieco lepiej, ale kod wtedy zaczyna wymagać komentarza, bo sam w sobie nie jest wystarczająco jasny.

Ja bym zrobił tak:

public static SomeClass CreateWithABandC(double a, double b, double c)
{
    this.A = a;
    this.B = b;
    this.C = c;
}

public static SomeClass CreateWithABandD(double a, double b, double d)
{
    this.A = a;
    this.B = b;
    this.D = d;
}

var someClass = SomeClass.CreateWithABandD(6, 6, 6);
0

Dziękuję za odpowiedź. Twój sposób rzeczywiście jest najlepszy.

Jeszcze jeden sposób przyszedł mi do głowy, co sądzisz/sądzicie o czymś takim?

 

class SomeClass {

        private double c;
        private double d;

        private bool canCreate = true;

        public double A { get; set; }
        public double B { get; set; }
        public double C {
            get { return c; }
            set
            {
               if(!canCreate)
                   throw new System.ArgumentException("wyjatek..");
               canCreate = false;
               c = value;

            }
        }
        public double D
        {
            get { return d; }
            set
            {
                if(!canCreate)
                    throw new System.ArgumentException("wyjatek..");
                canCreate = false;
                d = value;
            }

        }       

    }

Tworzenie obiektu:

 var a = new SomeClass
            {
                A = 1.0,
                B = 2.0,
                D = 4.0
            };
 

Edit: chyba największy minus tej metody to, że można stworzyć obiekt tylko z jedną właściwością, np. A.

0

może zapodaj jakiś konkretniejszy przykład

0

@mkr, ale co to jest to canCreate i do czego służy?

1 użytkowników online, w tym zalogowanych: 0, gości: 1