Возьмите этот код, например:Почему базовые конструкторы находятся в статическом контексте? Как справиться?
public class DisposeMe : IDisposable
{
public void Dispose()
{
Console.WriteLine("I'm disposed!");
}
}
public class Base
{
private readonly Object _object;
public Base(Object obj)
{
_object = obj;
}
}
public class Derived : Base, IDisposable
{
public Derived()
: base(new DisposeMe())
{
}
public void Dispose()
{
// Should dispose the object allocated in the constructor.
}
}
У меня есть такой код в реальной программе.
Что я на самом деле хотел бы сделать, это заменить new DisposeMe()
в Derived
конструктор, в метод, который будет создавать & вернуть его, но и сохранить его в поле в процессе, так что я мог распоряжаться его в Derived.Dispose
.
Однако я не могу, потому что по какой-либо причине (вне меня) конструктор, к которому обратился base
, является статическим. Зачем? Как я могу обойти это?
P.S. Я знаю, что я мог бы изменить Base
, чтобы быть IDisposable
, и пусть он проверяет, подан ли объект IDisposable
каждый раз, когда он расположен сам. Я не заинтересован в этом. Это громоздко, неэффективно и, самое главное, тот, кто выделил объект, должен быть ответственным за его удаление (иначе я бы стрелял в ногу, убирая объект, который используется где-то еще).
Где бы вы положить, что фабричный метод (тот, который должен создать 'IDisposable')? Можете ли вы представить пример кода, который демонстрирует ваше намерение? Обратите внимание, что вы не можете использовать метод * instance * 'Derived', поскольку ваш экземпляр * все еще строится *, когда вы вызываете конструктор' Derived'. –
@MattiasBuelens О, я вижу проблему сейчас. Так что же такое решение? У меня должна быть ссылка для распоряжения. Нужно ли мне менять свой дизайн? если так во что-то вроде чего? – MasterMastic
_ тот, кто выделил объект, должен быть ответственным .... Да, точно. И не должно нести ответственность за его хранение. У вас просто не должно быть этой проблемы. Считайте, что это сообщение: ваш основной дизайн испорчен. \ –