検索
(2006/08/10)
クラスとインスタンスの関係を使うことでこんなこともできるよといった例です。
クラスを直接インスタンス化することはできませんが、クラスからそのクラスのインスタンスの「配列」を取得します。
クラス図をご覧下さい。
コンストラクタはprivateなのでnewでのインスタンス生成はできません。 他に公開されているメソッドは、staticなGetMemberArrayのみです。 Memberクラスに自身のインスタンスの配列の取得を要求することになります。 それにより取得した配列の1つ1つの要素から、クラス図にあるように3つのプロパティから値が取得できます。
ソースコードは次の通りです。
1|using System; 2|using System.Collections; 3|using System.Data; 4|using System.Xml; 5| 6|namespace net.e_ioo.Sample0003 7|{ 8| public class Member 9| { 10| private int _id = 0; 11| private string _name = null; 12| private string _comment = null; 13| 14| private Member(int id, string name, string comment){ 15| _id = id; 16| _name = name; 17| _comment = comment; 18| } 19| 20| public static Member[] GetMemberArray(string filePath){ 21| return GetData(filePath); 22| } 23| 24| public int Id{ 25| get{ return _id; } 26| } 27| public string Name{ 28| get{ return _name; } 29| } 30| public string Comment{ 31| get{ return _comment; } } 32| 33| private static Member[] GetData(string filePath){ 34| ArrayList list = new ArrayList(); 35| 36| XmlDocument xmlDoc = new XmlDocument(); 37| xmlDoc.Load(filePath); 38| 39| XmlNodeReader xmlNodeReader 40| = new XmlNodeReader(xmlDoc.SelectSingleNode("root/member")); 41| DataSet ds = new DataSet(); 42| ds.ReadXml(xmlNodeReader); 43| 44| DataRow item = null; 45| int id; 46| string name = null; 47| string comment = null; 48| for(int i = 0; i < ds.Tables[0].Rows.Count; i++){ 49| item = ds.Tables[0].Rows[i]; 50| 51| id = int.Parse((string)item["id"]); 52| name = (string)item["name"]; 53| comment = (string)item["comment"]; 54| 55| list.Add(new Member(id, name, comment)); 56| } 57| 58| return (Member[])list.ToArray(typeof(Member)); 59| } 60| } 61|}
値を保持しているXMLファイルの定義を下に示します。
| XMLデータ | XML定義ファイル | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
<?xml version="1.0" encoding="SJIS" ?> <root> <member> <id>01</id> <name>鈴木</name> <comment></comment> </member> <member> <id>02</id> <name>佐藤</name> <comment></comment> </member> <member> <id>03</id> <name>山田</name> <comment></comment> </member> </root> |
このクラスはクラスの使用者にただ1つのみ使い方のみを提供しています。
それは「ファイルを指定することでMemberのインスタンスの配列を取得する」ことです。
もう少し掘り下げてみます。
3,4のおかげで取得データは完全に守られています。クラスの利用者が誤ってデータを書き換えてしまう、消してしまうということは起こり得ません。
このように、クラスで自身のインスタンスの制御を行うことも可能です。 クラスがただの雛形でないという1つの例です。
クラスとインスタンスを頭の中で常にイメージするよう心がけてください。 いおおのイメージはこんな感じです。
![]() |
![]() |
| インスタンス生成イメージ | GetMemberArrayイメージ |