costruttore di cloni / copia e classe figlio

1

Voglio solo un feedback su ciò che consideri il "design più elegante" per una situazione come questa.

Ho un oggetto che è immutabile con alcuni (alcuni) costruttori di copie per consentire la creazione di una versione simile ma modificata del mio oggetto immutabile. Quindi qualcosa di simile:

class ImmutableObject{
   Fee fee;
   Fi  fi;
   Fo fo;

   public ImmutableObject(Fee fee, Fi fi, Fo fo){
        this.Fee=fee;
        this.fi=fi;
        this.fo=fo;
   }

   public ImmutableObject(ImmutableObject cloneObj, Fee fee){
      this.fi=cloneObj.fi;
      this.fo=cloneObj.fo;
      this.fee=fee;
   }

   public ImmutableObject(ImmutableObject cloneObj, Fi fi){
      this.fee=cloneObj.fee;
      this.fo=cloneObj.fo;
      this.fi=fi
   }


   public ImmutableObject(ImmutableObject cloneObj, Fo fo){
      this.fi=cloneObj.fi;
      this.fee=cloneObj.fee;
      this.fo=fo;
   }
}

Ora sto espandendo questo creando una sottoclasse con un comportamento extra:

 Class ImmutableChild extends ImmutableObject{

   Fum fum;

   ImmutableChild(Fee fee, Fi fi, Fo fo, Fum fum){
      super(fee, fi, fo);
      this.fum=fum;
   }

Il problema è che ho una collezione di "ImmutableObjects" che contiene sia classi originali che secondarie. Quando provo a clonarli per ottenere un nuovo oggetto con un elemento modifid, i miei costruttori di copie creeranno sempre una classe di tipo genitore "ImmutableObject" e perdono completamente lo stato di "fum" se sto effettivamente clonando la classe child.

Posso facilmente refactoring questo per soddisfare qualsiasi soluzione che voglio, copiare costruttore, metodi clone ecc. Tuttavia, mentre posso ottenere il comportamento che voglio, non sono sicuro di ciò che sarebbe considerato sia soluzione elequant e non-ridimensionato. Qual è il metodo più pulito per consentire un metodo che creerà un "clone" del mio oggetto con un valore modificato che funziona bene con le classi per bambini che espandono la funzionalità?

    
posta dsollen 11.10.2013 - 20:31
fonte

1 risposta

0

Se non fosse per la complicazione dell'accettazione di possibili argomenti di modifica, forniresti semplicemente un metodo virtuale clone() in ImmutableObject che istanzia e poi restituisce un puntatore a ImmutableObject . Le classi derivate sovrascrivono la funzione e creano un'istanza del loro tipo derivato, ma la restituiscono ancora come ImmutableObject .

Come per gli argomenti extra passati ai "costruttori di copie", il codice che esegue la copia o chiama il metodo clone () è consapevole di queste differenze, quindi può semplicemente clonare l'oggetto e quindi modificare il clone se e quanto richiesto.

Potresti prendere in considerazione l'idea di portare informazioni di tipo semplice nella classe base - farebbe un'enumerazione - se devi downcast successivamente un oggetto clonato.

    
risposta data 16.10.2013 - 15:44
fonte

Leggi altre domande sui tag