C#初心者です。
複数のクラスのインスタンスを生成する方法について考えていました。
最初に考えたコードをコード1に示します。
Class1, Class2, ... のように連続する名前のクラスを作りました。
そしてこれらのインスタンスを生成するコードも書きました。
Program::createInstanceがそれです。
C#
1// コード1 2 3using System; 4 5class Program 6{ 7 public static void Main() 8 { 9 Console.WriteLine(createInstance(1).Name); 10 Console.WriteLine(createInstance(2).Name); 11 } 12 13 // インスタンスを生成する (例外に対する処理は今回は省いてあります) 14 public static ClassBase createInstance(int num) 15 => Activator.CreateInstance(Type.GetType($"Class{num}")) as ClassBase; 16} 17 18abstract class ClassBase 19{ 20 public abstract string Name { get; } 21} 22 23class Class1 : ClassBase 24{ 25 public override string Name 26 => "クラス1"; 27} 28 29class Class2 : ClassBase 30{ 31 public override string Name 32 => "クラス2"; 33}
例外処理などは省きましたが、このような感じです。
さて、このように書いてしまいましたが、
静的な型指定をした場合に比べて
危険なコードになったと思います。
なので、静的な型指定をする方法に変えてみました。
それをコード2に示します。
C#
1// コード2 2 3using System; 4 5class Program 6{ 7 public static void Main() 8 { 9 Console.WriteLine(createInstance(1).Name); 10 Console.WriteLine(createInstance(2).Name); 11 } 12 13 public static ClassBase createInstance(int num) 14 { 15 switch (num) 16 { 17 case 1: 18 return new Class1(); 19 20 case 2: 21 return new Class2(); 22 23 default: 24 return null; 25 } 26 } 27} 28 29abstract class ClassBase 30{ 31 public abstract string Name { get; } 32} 33 34class Class1 : ClassBase 35{ 36 public override string Name 37 => "クラス1"; 38} 39 40class Class2 : ClassrBase 41{ 42 public override string Name 43 => "クラス2"; 44}
確かにコード2はコード1に比べて安全になったのかもしれませんが、
コードを書く量が増えました。
コード1中のProgram::createInstanceは
ClassBaseの派生クラスの数がどれだけ増えても1行、
例外を対処するコードを入れたとしても
それほど量は増えないでしょう。
それに対して、コード2中のProgram::createInstanceは
ClassBaseの派生クラスの数が増えれば増えるほど
コードが長くなります。
たとえば Class1 から Class718 までクラスがあるとすると
コード2の書き方でいけば
Program::createInstanceは2159行にもなることが予想されます。
いくら安全性のためとはいえ
これは大変だと思います。
そこで疑問に思いました。
皆さんなら
・コード1のやり方
・コード2のやり方
・それ以外のやり方
どのように書きますか。
追記
例を変えました。
あと、「必ずしもクラスにする必要は無いのではないか?」
という回答もやめてください。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/05/21 14:45