spesso finiscono per scrivere classi come questo:Ridurre costruttore codice piastra della caldaia
public class Animal
{
public string Colour { get; set; }
public int Weight { get; set; }
public Animal(Dog data)
{
this.Colour = data.Colour;
this.Weight = data.Weight;
}
public Animal(Cat data)
{
this.Colour = data.Colour;
this.Weight = data.Weight;
}
}
Quando si dispone di un sacco di proprietà e tipi poi si finisce in fretta con un sacco di codice refusi. Idealmente in questa situazione vorrei solo creare un'interfaccia IAnimal e fare riferimento a questo. Sono attualmente in una situazione in cui le classi Dog e Cat esistono in un assembly di terze parti e non posso modificarle. L'unica soluzione che posso venire in mente è:
public class Animal
{
public string Colour { get; set; }
public int Weight { get; set; }
public Animal(Cat data){Init(data);}
public Animal(Dog data){Init(data);}
private void Init(dynamic data)
{
this.Colour = data.Colour;
this.Weight = data.Weight;
}
}
Questo funziona, ma ho perso tutta la sicurezza di tipo, c'è una soluzione migliore rispetto a iniezione costruttore?
Grazie,
Joe
EDIT: Ecco un esempio reale mondo. Ho una libreria di terze parti che restituisce 3 oggetti chiamato:
- GetPageByIdResult
- GetPagesByParentIdResult
- GetPagesByDateResult
(Questi vengono generati tutte auto di classi da un riferimento al servizio e le proprietà sono praticamente identico)
Invece di gestire questi tre oggetti, desidero gestire un singolo oggetto PageData o una raccolta di essi.
Sembra una classe strana, perché Cat e Dog non ereditano da Animal? –
se 'Cane' e' Gatto' ereditano da 'Animale', puoi provare:' Animale pubblico (dati Anima) ' –
Copia Costruttore sull'oggetto base/padre sicuramente non dovrebbe soddisfare tutti i casi dei suoi tipi derivati. Inoltre, se 'Cat' e' Dog' ereditano da 'Animal' puoi fare perfettamente con un singolo costruttore con un parametro' Animal'. – haim770