質問: C#初心者です。 複数のクラスのインスタンスを生成する方法について考えていました。 最初に考えたコードをコード1に示します。 Class1, Class2, ... のように連続する名前のクラスを作りました。 そしてこれらのインスタンスを生成するコードも書きました。 Program::createInstanceがそれです。 ``` // コード1 using System; class Program { public static void Main() { Console.WriteLine(createInstance(1).Name); Console.WriteLine(createInstance(2).Name); } // インスタンスを生成する (例外に対する処理は今回は省いてあります) public static ClassBase createInstance(int num) => Activator.CreateInstance(Type.GetType($"Class{num}")) as ClassBase; } abstract class ClassBase { public abstract string Name { get; } } class Class1 : ClassBase { public override string Name => "クラス1"; } class Class2 : ClassBase { public override string Name => "クラス2"; } ``` 例外処理などは省きましたが、このような感じです。 さて、このように書いてしまいましたが、 静的な型指定をした場合に比べて 危険なコードになったと思います。 なので、静的な型指定をする方法に変えてみました。 それをコード2に示します。 ``` // コード2 using System; class Program { public static void Main() { Console.WriteLine(createInstance(1).Name); Console.WriteLine(createInstance(2).Name); } public static ClassBase createInstance(int num) { switch (num) { case 1: return new Class1(); case 2: return new Class2(); default: return null; } } } abstract class ClassBase { public abstract string Name { get; } } class Class1 : ClassBase { public override string Name => "クラス1"; } class Class2 : ClassrBase { public override string Name => "クラス2"; } ``` 確かにコード2はコード1に比べて安全になったのかもしれませんが、 コードを書く量が増えました。 コード1中のProgram::createInstanceは ClassBaseの派生クラスの数がどれだけ増えても1行、 例外を対処するコードを入れたとしても それほど量は増えないでしょう。 それに対して、コード2中のProgram::createInstanceは ClassBaseの派生クラスの数が増えれば増えるほど コードが長くなります。 たとえば Class1 から Class718 までクラスがあるとすると コード2の書き方でいけば Program::createInstanceは2159行にもなることが予想されます。 いくら安全性のためとはいえ これは大変だと思います。 そこで疑問に思いました。 皆さんなら ・コード1のやり方 ・コード2のやり方 ・それ以外のやり方 どのように書きますか。 追記 例を変えました。 あと、「必ずしもクラスにする必要は無いのではないか?」 という回答もやめてください。
回答: 派生クラスが700以上もあるとなると、やはりコード1方式がベースになるかと。 ただし、実在するクラス名であることをテストする Assert() を入れるか、せめて try catch で例外をハンドリングするくらいのことは必要ではないかと思います。