Я создал интерфейс с одним методом, способным копировать содержимое одного объекта в другой объект того же типа (фактическая функциональность не имеет отношения к вопросу).Реализация общего метода
public interface IDeepClonable
{
void DeepClone<T>(T other);
}
У меня возникли проблемы с надлежащей реализацией.
То, что я действительно хотел бы, чтобы реализовать его, как это (там, где это находится внутри ClassA, который реализует IDeepClonable)
public void DeepClone<ClassA>(ClassA other)
{
this.A = other.A;
}
Однако это не работает, так как «другой» объект не опознан как экземпляр ClassA компилятором (почему?)
Это тоже не сработает, так как оно дает «ограничения для параметра типа T, должны соответствовать методу интерфейса (...).
public void DeepClone<T>(T other) where T : ClassA
{
this.A= other.A;
}
я могу решить все проблемы путем изменения интерфейса, чтобы взять в качестве объекта вместо общего ограничения, но я надеялся на более элегантное решение.
Я также могу решить это, превратив интерфейс в общий интерфейс, но затем это заставляет меня использовать этот общий интерфейс.
BTW, 'DeepClone' является неправильным именем; метод под названием «DeepClone» должен вернуть копию. Вы должны называть это «DeepCloneFrom» или что-то в этом роде. – SLaks
Я бы предположил, что если вы собираетесь делать глубокое клонирование, может быть полезно определить 'IImmutableClonable' с помощью метода 'T AsImmutable()', 'IModifiableClone ' с методом 'U AsNewMutable()', и 'IFullClone ' наследует оба вышеперечисленных. Неизменяемые объекты просто вернутся из своих реализаций 'AsImmutable()'; 'AsNewMutable()' возвращает то, что позволяет, как минимум, любые методы мутации, требуемые контрактом U'. –
supercat