- 2023/06/05 内容を修正
DeepCopy.Expression ライブラリは、インターフェースや基底クラスのディープコピーにも対応しています。インターフェースや基底クラスとは、抽象的な概念や共通の機能を定義したものであり、ポリモーフィズムを使うことで、柔軟で再利用性の高いコードを書くことができるよいうになります。
しかし、ポリモーフィズムを使ったオブジェクトをディープコピーする場合には注意が必要です。シリアライズとデシリアライズを使う方法では、具体的なクラスの情報が失われてしまう可能性があります。
DeepCopy.Expression ライブラリでは、この問題を解決するために、インターフェースや基底クラスの型変数に代入されている具体的なクラスの型情報も保持しておきます。これによりインターフェースや基底クラスのディープコピーでもポリモーフィズムが保たれます。
例えば次のようなコードでディープコピーすることができます。
対象のクラス
検証用に以下のクラスを用意しました。TestData クラスが複製対象となるオブジェクトです。
public sealed class TestData
{
public IList Shapes { get; } =
new List();
}
public abstract class Shape
{
public string? Name { get; set; }
public virtual double Area { get; }
}
public sealed class Circle : Shape
{
public double Radius { get; set; }
public override double Area =>
Radius * Radius * Math.PI;
}
public sealed class Rectangle : Shape
{
public double Width { get; set; }
public double Height { get; set; }
public override double Area =>
Width * Height;
}
var data = new TestData();
data.Shapes.Add(new Circle { Name = "Circle1", Radius = 10 });
data.Shapes.Add(new Rectangle { Name = "Rectangle1", Width = 5, Height = 4 });
Console.WriteLine("[Source]");
foreach (var shape in data.Shapes)
{
Console.WriteLine($" {shape.Name} => Area: {shape.Area}");
}
var cloned = ObjectCloner.Clone(data);
Console.WriteLine("[Cloned]");
foreach (var shape in cloned.Shapes)
{
Console.WriteLine($" {shape.Name} => Area: {shape.Area}");
}
[Source] Circle1 => Area: 314.1592653589793 Rectangle1 => Area: 20 [Cloned] Circle1 => Area: 314.1592653589793 Rectangle1 => Area: 20
まとめ
このように、DeepCopy.Expression ライブラリは、インターフェースや基底クラスのディープコピーにも対応しており、オブジェクトの型情報を保持しながら、高速かつ安全にディープコピーを行うことができます。