<?xml version='1.0' encoding='Shift_JIS' ?>
<doc xml:lang='ja'>
	<head>
		<title>Type</title>
	</head>
	<body>
		<p>TypeとはAgent、Goods、Relation、Information、Behaviorのそれぞれに付属し、その型を表すクラスです。</p>
		<p>
			Typeはモデルに存在するオブジェクトの要素を抽象化・分類して取得や指定するときに識別するための道具として導入されました。Typeを利用することにより、例えば同じ振る舞いをするAgentでもTypeが異なれば違うAgentとして扱い、また逆に違う振る舞いをするAgentでもTypeが同じであれば、同じAgentとして扱うことができます。これにより、柔軟な検索・取得・識別を可能にしました。</p>
		<p>
			また、Typeはそれぞれが親子関係を持つことができます。これによって上位概念・下位概念を表現することができ、Type間の包含・継承・依存などの関係を表現することもできます。これによって、実装に依存してしまうクラスよりも柔軟な要素の体系化を行うことが出来ます。つまり、クラスによる要素の分類も可能ですが、Javaの言語規定によりクラスの多重継承は禁止されています。Typeを用いれば多重継承は可能です。</p>
		<p>
			親子関係を構築して関連付けられたType群は意味空間として扱うことができます。これによってモデルの語彙を表現することが可能になりました。そして、Typeはモデルに付属するものではなく、コンテナによって管理されるため、複数のモデルで意味空間を共有することができます。</p>
		<p>このようなTypeの仕組みを実装したのが以下のクラス図です。</p>
		<figure id="fig:lastyear1" src="image/type" title="Typeクラス図" />
		<p>
			親である抽象Typeクラスは２つの特徴を持っています。１つはTypeの識別子としても用いられる名前を持っているということ、複数個の親・子Typeを持つことができるということです。</p>
		<p>
			そして、抽象Typeクラスを継承して、AgentTyp、BehaviorType、GoodsType、InformationType、RelationTypeの５つのTypeが存在し、それぞれ対応するオブジェクトは必ずTypeを持っています。これら５つのTypeは別々に管理されます（例えばGoodsTypeとAgentTypeで同じ名前のTypeが存在していてもそれは別Typeとして扱われます）。</p>
		<p>
			TypeはInformationを継承しているため、Informationと同じように扱うことができます（例えば、Goodsにそのまま付随させて他のエージェント送ることができます）。</p>
		<p>
			Typeの追加はモデルの中で行うことも出来ますが、あらかじめ使用するTypeを(Worldのinitializeメソッドなどで)全て追加しておくことを推奨します。また、InformationTypeとBehaviorTypeは特殊で読み込み時に自動的にそのクラス名のTypeが作成されます。</p>
		<p>TypeはWorldのメソッドから取得できます（詳細はAPIまたは実装リファレンスを参照してください）。</p>
	</body>
</doc>
