Il modo migliore per applicare i vincoli in Class

2

Ho una classe, qualcosa come questa (C #):

public class MyFavoriteClass 
{
   public string Name { get; set; }

   public string Description { get; set; }

   (...)

   public ReferencedClass1 ReferencedClass1 {get; protected set;}

   public ReferencedClass2 ReferencedClass2  {get; protected set;}

   public ReferencedClass3 ReferencedClass3  {get; protected set;}

   public AnotherReferencedClass1 AnotherReferencedClass1  {get; protected set;}

   public AnotherReferencedClass2 AnotherReferencedClass2  {get; protected set;}

   public AnotherReferencedClass3 AnotherReferencedClass3  {get; protected set;}
}

Le classi di riferimento non hanno alcuna classe di antenato comune.

Ci sono dei vincoli:

Oggetto (istanza di MyFavoriteClass) può aver impostato solo una delle proprietà ReferencedClass1, ReferencedClass2 e ReferencedClass3. Gli altri devono essere nulli.

Stessa regola per AnotherReferencedClass1, AnotherReferencedClass2 e AnotherReferencedClass3.

Qual è il modo migliore per far rispettare questi vincoli? Nel modello di fabbrica? Devo scrivere nove metodi in questa fabbrica? O dovrei wrappare queste opzioni in un altro oggetto?

    
posta ingenyyr 22.04.2016 - 14:19
fonte

2 risposte

1

Sembra che MyFavoriteClass sia un problema e dovrebbe essere diviso. Crea specializzazioni di questa classe che possono contenere solo una coppia specifica di tipi di riferimento, ecco come ottieni il vincolo.

Quindi utilizza uno stabilimento in grado di emettere le specializzazioni corrette di MyFavoriteClass . È possibile fornire un sovraccarico per ciascuna combinazione di parametri possibili o semplicemente affidarsi al rilevamento dinamico del tipo, a tua scelta.

Approccio alternativo, crea solo una classe wrapper che includa specializzazioni che incapsulino ognuna delle terzine - in questo modo MyFavoriteClass non ha bisogno di conoscere dettagli specifici e puoi evitare di dover creare tutte e 9 le combinazioni.

Questo è solo se MyFavoriteClass non ha bisogno di preoccuparsi di casi speciali però.

    
risposta data 22.04.2016 - 14:33
fonte
0

Potresti usare i generici, ma non è proprio come il tuo esempio.

MyFaveClass<T>
{
    public T OnlyOneOfThese { get; set; }
}


var x = new MyFaveClass<AnotherClass>();

Ecco un altro metodo che ti permette di impostare l'oggetto. L'operatore as restituisce null se non riesce a fare il cast, quindi questo si basa sulle classi che non ereditano l'una dall'altra

MyFaveClass
{
    public ClassA opt1
    {
         get {
             return onlyOneOfThese as ClassA;
         }
         set {
             onlyOneOfThese = value;
        }
    }
    public ClassB  opt2
    {
         get {
             return onlyOneOfThese as ClassB;
         }
         set {
             onlyOneOfThese = value;
        }
    }
    private object onlyOneOfThese;
}
    
risposta data 22.04.2016 - 15:00
fonte

Leggi altre domande sui tag