Возврат ссылки на приватный конструктор из метода

Как из метода Create возвращается ссылка на конструктор?

Не могли бы вы описать, как этот процесс реализован и/или поделиться источником как такое реализовывается, и как такой подход называется?

class TestClass : ValueObject{
   private readonly int _price;
   private TestClass (int price) {
     _price = price;
   }
   public Result<TestClass> Create(int price) {
     if(price < 0) {
       return Result.Failure<TestClass>("Цена должна быть больше или равной нулю");
     }
     return
       Result.Success(new TestClass(price));
   }
}

p.s. Что внутри ValueObject мне не известно.


Ответы (1 шт):

Автор решения: aepot

Я называю это "именованный конструктор". То есть вы можете создать несколько статичных методов, которые создают экземпляр класса по разным аргументам и назвать их по разному.

По сути, решение вашей проблемы - добавление модификатора static к методу.

public static Result<TestClass> Create(int price)
{
    if (price < 0)
    {
        return Result.Failure<TestClass>("Цена должна быть больше или равной нулю");
    }
    return Result.Success(new TestClass(price));
}

И вот так вызвать

var obj = TestClass.Create(0);

Хорошие примеры есть прямо в API .NET

File.Create
File.Open
File.OpenRead
File.OpenWrite

Все эти 4 метода возвращают экземпляр FileStream.

Или есть такое

Image.FromFile
Image.FromHBitmap
Image.FromStream

А эти возвращают экземпляр наследника Bitmap.

То есть в обоих случаях тип получившегося объекта не соответствет типу класса, к методу которого идет обращение. Но ваш случай тоже рабочий. Например он может потребоваться, когда для контроля создаваемых экземпляров используется например фабрика или пул. То есть создание такого статичного метода делает необязательным вызов new, объект может быть уже ранее создан, но взят откуда-то из хранилища. При прямом вызове публичного конструктора через new такой прием невозможен.

К тому же, по именам методов легче понять, что они делают, чем понять по аргументам обычных конструкторов.

→ Ссылка