C# 継承元で継承先の型を使用したい

C#では、継承元で継承先の型を使用することが言語レベルではサポートされていません。これはクローンメソッドなどを作成する場合に不便です。

以下のようにジェネリックを使用することで同等のことが一応行えるようになります。

//継承元クラス
abstract class ClassA<TClass> where TClass : ClassA<TClass>, new() {
 public abstract TClass Clone();
}

//継承先クラス
class ClassB : ClassA<ClassB> {
 public int Value { get; private set; }

 public override ClassB Clone() {
  ClassB obj = new ClassB();
  obj.Value = Value;
  return obj;
 }
}

この場合、継承先クラスの型を知るためにTClassを使用しています。TClassの制約にClassA<TClass>が入っているので、ClassA<TClass>を継承したクラスしかTClassに使用できなくなっています。

同等のことが実現できましたが、見た目がシンプルでは無いですね。やはり言語レベルで何とかして欲しいところです。なお、アップルのSwift言語にはこの機能が実装されているそうです。

コメントを残す