C#3.0でジェネリックスを使用していた人がJava6でジェネリックスを使用すると...(3)
こんにちは。受託開発担当(ここでは雑記担当)のMasaです。
前々回、前回に引き続き C# と Java におけるジェネリックなクラスについてを検証します。
まずは C# です。前々回作成した MyObject1 、 MyObject2 クラスにプロパティとデバッグ用メソッドを追加します。
public class MyObject1 : MyObject { public MyObject1() : base() { } public MyObject1(string name, string company) : base(name) { this.Company = company; } public string Company { get; private set; } public override string ToString() { return "名前は、" + this.Name + "です。企業は、" + this.Company + "です。"; } } public class MyObject2 : MyObject { public MyObject2() : base() { } public MyObject2(string name, string value) : base(name) { this.Value = value; } public string Value { get; private set; } public override string ToString() { return "名前は、" + this.Name + "です。値は、" + this.Value + "です。"; } }
次はジェネリックなクラスです。適当な仕組みが思いつかなかったのでイベントリスナー風の何かを作成します。
とりあえず適当なインタフェースを作成します。
public interface MyObjectContainer<T> where T : MyObject, new() { T GetInstance(); }
上記インタフェースを実装したクラスを追加します。ファイルを分けるのが面倒なので、前々回作成した Test クラスにプライベートクラスを追加しちゃいます。
private class MyObject1Container : MyObjectContainer<MyObject1> { #region MyObjectContainer<MyObject1> メンバ public MyObject1 GetInstance() { return new MyObject1("C#", "Microsoft"); } #endregion } private class MyObject2Container : MyObjectContainer<MyObject2> { #region MyObjectContainer<MyObject2> メンバ public MyObject2 GetInstance() { return new MyObject2("C#", "3.0"); } #endregion }
MyObjectContainer クラスを格納するリストを追加します。ちょっとごちゃごちゃしてきたのでクラスを分けます。
public class MyObjectTest { private IList MyObjectContainerList { get; set; } public void AddMyObjectContainer<T>(MyObjectContainer<T> container) where T : MyObject, new() { if (MyObjectContainerList == null) MyObjectContainerList = new ArrayList(); MyObjectContainerList.Add(container); } public void Execute<T>() where T : MyObject, new() { // リストから指定された型パラメータを持つ Container クラスを取得し、クラス情報を出力します。 IEnumerable<MyObjectContainer<T>> list = MyObjectContainerList.OfType<MyObjectContainer<T>>(); if (list.Any()) { foreach (MyObjectContainer<T> container in list) Console.WriteLine(container.GetInstance().ToString()); } } }
準備が整ったので、Test クラスにテストメソッドを追加し、実行します。
static void Main(string[] args) { Test test = new Test(); MyObjectTest myObjectTest = new MyObjectTest(); myObjectTest.AddMyObjectContainer(new MyObject1Container()); myObjectTest.AddMyObjectContainer(new MyObject2Container()); Console.WriteLine("Execute<MyObject1>()が呼ばれるはずです。"); myObjectTest.Execute<MyObject1>(); Console.WriteLine("Execute<MyObject2>()が呼ばれるはずです。"); myObjectTest.Execute<MyObject2>(); }
何の苦労もなく実行できます。
次回は Java です。