BeerLambertLawAtmosphericAttenuationModel.Clone Method |
Namespace: AGI.Foundation.Communications.SignalPropagation
This method should be implemented to call a copy constructor on the class of the object being cloned. The copy constructor should take the CopyContext as a parameter in addition to the existing instance to copy. The copy constructor should first call AddObjectMapping<T> (T, T) to identify the newly constructed instance as a copy of the existing instance. It should then copy all fields, using UpdateReference<T> (T) to copy any reference fields.
A typical implementation of ICloneWithContext:
public class MyClass : ICloneWithContext { public MyClass(MyClass existingInstance, CopyContext context) { context.AddObjectMapping(existingInstance, this); someReference = context.UpdateReference(existingInstance.someReference); } public object Clone(CopyContext context) { return new MyClass(this, context); } private object someReference; }
In general, all fields that are reference types should be copied with a call to UpdateReference<T>(T). There are a couple of exceptions:
If one of these exceptions applies, the CopyContext should be given an opportunity to update the reference before the reference is copied explicitly. Use UpdateReference<T> (T) to update the reference. If UpdateReference<T> (T) returns the original object, indicating that the context does not have a replacement registered, then copy the object manually by invoking a Clone method, a copy constructor, or by manually constructing a new instance and copying the values.
alwaysCopy = context.UpdateReference(existingInstance.alwaysCopy); if (existingInstance.alwaysCopy != null && ReferenceEquals(alwaysCopy, existingInstance.alwaysCopy)) { alwaysCopy = existingInstance.alwaysCopy.Clone(context) as AlwaysCopy; }
If you are implementing an evaluator (a class that implements IEvaluator), the UpdateEvaluatorReferences(CopyContext) method shares some responsibilities with the copy context constructor. Code duplication can be avoided by doing the following:
public MyClass(MyClass existingInstance, CopyContext context) : base(existingInstance, context) { someReference = context.UpdateReference(existingInstance.someReference); evaluatorReference = existingInstance.evaluatorReference; UpdateEvaluatorReferences(context); } public override void UpdateEvaluatorReferences(CopyContext context) { evaluatorReference = context.UpdateReference(evaluatorReference); } public override object Clone(CopyContext context) { return new MyClass(this, context); } private object someReference; private IEvaluator evaluatorReference;