я часто в конечном итоге писать классы так:Сокращения конструктор кода котла плита
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;
}
}
Если у вас есть много свойств и типов, то вы быстро в конечном итоге с большим количеством коды котла пластины. В идеале в этой ситуации я бы просто создал интерфейс IAnimal и ссылку на него. Я сейчас в ситуации, когда классы Dog и Cat существуют в третьей стороне, и я не могу их модифицировать. Единственное решение, которое я могу придумать это:
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;
}
}
Это работает, но я теряю все типобезопасность, есть лучшее решение, чем инъекции конструктора?
Спасибо,
Джо
EDIT: Вот реальный пример. У меня есть библиотека третья сторона, которая возвращает 3 объекта называется:
- GetPageByIdResult
- GetPagesByParentIdResult
- GetPagesByDateResult
(Это все автогенерируемая классы из ссылки на службу и свойства в значительной степени идентичны)
Вместо того чтобы иметь дело с этими тремя объектами, я хочу иметь дело с одним объектом PageData или их коллекцией.
Похож на странный класс, почему Кошка и Собака не наследуют от животных? –
, если 'Dog' и' Cat' наследуются от 'Animal', вы можете попробовать:' public Animal (Anima data) ' –
Copy Constructor на базовом/родительском объекте определенно не должен обслуживать все случаи его производных типов. Кроме того, если «Cat» и «Dog», наследующие «Animal», вы можете отлично справиться с одним конструктором с параметром «Animal». – haim770