いもづる オブジェクト指向

クラスで自身のインスタンスを制御

(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定義ファイル
id name comment
01 鈴木  
02 佐藤  
03 山田  
<?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のインスタンスの配列を取得する」ことです。
もう少し掘り下げてみます。

  1. コンストラクタが隠蔽されているので直接インスタンスを生成できない
  2. クラスがデータ取得の処理を受け持ち、インスタンスは単なるデータクラス
  3. 取得したデータ(配列)の要素の増減はできない
  4. 1つ1つのインスタンス内のデータ内容を変更できない

3,4のおかげで取得データは完全に守られています。クラスの利用者が誤ってデータを書き換えてしまう、消してしまうということは起こり得ません。

このように、クラスで自身のインスタンスの制御を行うことも可能です。 クラスがただの雛形でないという1つの例です。

クラスとインスタンスを頭の中で常にイメージするよう心がけてください。 いおおのイメージはこんな感じです。

インスタンス生成イメージ GetMemberArrayイメージ
インスタンス生成イメージ GetMemberArrayイメージ

 

webmaster@e-ioo.net