Могу ли я использовать контракты кода, чтобы обойти невозможность иметь общие ограничения конструктора? - PullRequest
2 голосов
/ 03 октября 2011

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

public class Copier<o, c>
    where o : class, INotifyPropertyChanged
    where c : class, c // ideally new(datetime, o)
{
    private Dictionary<DateTime, c> copies;

    public Copier(o original)
    {
        this.copies = new Dictionary<DateTime, c>();
        original.PropertyChanged += 
            this.propertyChangedHandler(object sender, PropertyChangedEventArgs args);
    }

    private void propertyChangedHandler(object sender, PropertyChangedEventArgs args)
    {
        var original = sender as o;
        var now = DateTime.Now;
        this.copies.Add(now, new c(now, original)); // error here
    }
}

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

Примечание: существует требование (наложенное мной), что исходные объекты не могут быть изменены.

1 Ответ

1 голос
/ 03 октября 2011

Как предлагается, передайте делегат создания:

public class Copier<o, c>
    where o : class, INotifyPropertyChanged
    where c : class, c // ideally new(datetime, o)
{
private Dictionary<DateTime, c> copies;
private Func<o, DateTime, c> copyFunc;

public Copier(o original, Func<o, DateTime, c> copyFunc)
{
    this.copyFunc = copyFunc;
    this.copies = new Dictionary<DateTime, c>();
    original.PropertyChanged += 
        this.propertyChangedHandler(object sender, PropertyChangedEventArgs args);
}

private void propertyChangedHandler(object sender, PropertyChangedEventArgs args)
{
    var original = sender as o;
    var now = DateTime.Now;
    this.copies.Add(copyFunc(now, original)); 
}

}

...