Итак, предполагая, что вы (или кто-то еще) не можете использовать условный оператор null, есть ли веская причина использовать этот шаблон методов, создающих объекты, вместо конструкторов, создающих объекты? Конструкторы гарантированно не возвращают null.
Похоже, у вас есть некоторая иерархия преобразования или вложенных объектов, но нет иерархии наследования, где вы могли бы просто вернуться к полиморфизму. Может быть, такой инструмент, как AutoMapper, может быть полезен для последовательного кодирования этих методов ToX ()?
Я не уверен, насколько это будет «вложенным». Ваш метод CreateB () будет выглядеть точно так же, как ваш код CreateA (). У вас не получится "пирамида", только множество идентичных методов.
ObjectB CreateB()
{
ObjectC c = CreateC();
if (c != null)
{
ObjectB b = c.ToB();
return b;
}
return null;
}
В большинстве случаев вы делаете это в среде, где вы не контролируете все классы. В этом случае лучшим подходом будет написание собственных функций преобразования или AutoMapper (что действительно стоит потраченного времени). Но если вы владеете иерархией классов, вы можете реализовать абстрактный класс, который сделает за вас большую часть тяжелой работы. Но, честно говоря, я бы написал что-то подобное, только если бы у меня была действительно веская причина (нечто большее, чем я просто хотел трахаться с людьми). Я включаю это, чтобы продемонстрировать, насколько проще жизнь, если вы просто используете конструктор, который гарантированно не вернет null;
public abstract class MyAbstractObject<Tobj> where TObj: MyAbstractObject, new()
{
public static MyAbstractObject CreateObject()
{
Tobj subOb = new TObj();
MyAbstractObject parent = subOb.ToObject();
return parent;
}
public virtual TObj ToObject()
{
return CreateObject();
}
}
public class ObjectD : MyAbstractObject<ObjectC> { }
public class ObjectC : MyAbstractObject<ObjectB> { }
public class ObjectB : MyAbstractObject<ObjectA> { }
public class ObjectA : MyAbstractObject<ObjectA>
{
public override TObj ToObject()
{
return this;
}
}
static void Main()
{
ObjectA a = ObjectD.CreateObject();
}
person
Michael Blackburn
schedule
31.03.2017