<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>Delphi</title><link>http://blogs.wankuma.com/umebayashi/category/888.aspx</link><description>Delphi</description><managingEditor>梅林(umebayashi@wankuma.com)</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>梅林(umebayashi@wankuma.com)</dc:creator><title>配列プロパティとインデクサ</title><link>http://blogs.wankuma.com/umebayashi/archive/2007/02/08/61500.aspx</link><pubDate>Thu, 08 Feb 2007 01:07:00 GMT</pubDate><guid>http://blogs.wankuma.com/umebayashi/archive/2007/02/08/61500.aspx</guid><wfw:comment>http://blogs.wankuma.com/umebayashi/comments/61500.aspx</wfw:comment><comments>http://blogs.wankuma.com/umebayashi/archive/2007/02/08/61500.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/umebayashi/comments/commentRss/61500.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/umebayashi/services/trackbacks/61500.aspx</trackback:ping><description>&lt;P&gt;以前のεπιστημηさんの&lt;A href="http://blogs.wankuma.com/episteme/archive/2006/11/17/45942.aspx"&gt;VB嫌い[2]&lt;/A&gt;というエントリーで&lt;BR&gt;VBの引数付きプロパティとC#のインデクサを比較する話がありました。&lt;/P&gt;
&lt;P&gt;Delphiにも配列プロパティというのがありまして、VBの引数付きプロパティと&lt;BR&gt;同じような使い方ができます。(のはず。VB知らないので間違ってたらご指摘ください。)&lt;/P&gt;
&lt;P&gt;
&lt;HR id=null&gt;
&lt;FONT face="Courier New"&gt;type&lt;BR&gt;&amp;nbsp; TAnimals = class(TObject)&lt;BR&gt;&amp;nbsp; private&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function GetDog(Index: Integer): TDog;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; procedure SetDog(Index: Integer; Value: TDog);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; function GetCat(Index: String): TCat;&lt;BR&gt;&amp;nbsp; public&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //ReadWriteプロパティ&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; property Dogs[Index: Integer]: TDog read GetDog write SetDog;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //ReadOnlyプロパティ&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; property Cats[Index: String]: TCat read GetCat;&lt;BR&gt;&amp;nbsp; end;&lt;BR&gt;&lt;/FONT&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;C#のインデクサと比較しての便利さは、やはりgetterとsetterのメソッドを定義するだけで&lt;BR&gt;使えるところ。&lt;BR&gt;そこで、C#2.0のジェネリックを使って、以下のようなユーティリティクラスを作ってみました。&lt;/P&gt;
&lt;P&gt;
&lt;HR id=null&gt;
&lt;FONT face="Courier New"&gt;public delegate V ArrayProperty1Get&amp;lt;V, K1&amp;gt;&lt;V,K1&gt;&lt;V, K1&gt;(K1 key1);&lt;BR&gt;public delegate void ArrayProperty1Set&lt;V,K1&gt;&lt;V, K1&gt;&amp;lt;V, K1&amp;gt;(K1 key1, V value);&lt;/FONT&gt; 
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;public class ReadOnlyArrayProperty1&amp;lt;V, K1&amp;gt;&lt;V,K1&gt;&lt;V, K1&gt;&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; public ReadOnlyArrayProperty1(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ArrayProperty1Get&amp;lt;V, K1&amp;gt;&lt;V,K1&gt;&lt;V, K1&gt; getMethod)&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.getMethod = getMethod;&lt;BR&gt;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp; private ArrayProperty1Get&amp;lt;V, K1&amp;gt;&lt;V,K1&gt;&lt;V, K1&gt; getMethod;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp; public V this[K1 key1]&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return getMethod(key1);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;public class ReadWriteArrayProperty1&amp;lt;V, K1&amp;gt;&lt;V,K1&gt;&lt;V, K1&gt;&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; public ReadWriteArrayProperty1(&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ArrayProperty1Get&amp;lt;V, K1&amp;gt;&lt;V,K1&gt;&lt;V, K1&gt; getMethod,&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ArrayProperty1Set&lt;V,K1&gt;&lt;V, K1&gt;&amp;lt;V, K1&amp;gt; setMethod)&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.getMethod = getMethod;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; this.setMethod = setMethod;&lt;BR&gt;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp; private ArrayProperty1Get&amp;lt;V, K1&amp;gt;&lt;V,K1&gt;&lt;V, K1&gt; getMethod;&lt;BR&gt;&amp;nbsp; private ArrayProperty1Set&lt;V,K1&gt;&lt;V, K1&gt;&amp;lt;V, K1&amp;gt; setMethod;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp; public V this[K1 key1]&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; get&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return getMethod(key1);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; set&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; setMethod(key1, value);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;}&lt;BR&gt;&lt;/FONT&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;これを使うと&lt;/P&gt;
&lt;P&gt;
&lt;HR id=null&gt;
&lt;FONT face="Courier New"&gt;public class Animals&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; public Animals()&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dogs = new ReadWriteArrayProperty1&amp;lt;Dog, int&amp;gt;&lt;DOG, int&gt;&lt;DOG, int&gt;(GetDog, SetDog);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Cats = new ReadOnlyArrayProperty1&amp;lt;Cat, string&amp;gt;&lt;CAT, string&gt;&lt;CAT, string&gt;(GetCat);&lt;BR&gt;&amp;nbsp; }&lt;/FONT&gt; 
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp; private Dog GetDog(int index)&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;BR&gt;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp; private void SetDog(int index, Dog value)&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;BR&gt;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp; private Cat GetCat(string index)&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //&lt;BR&gt;&amp;nbsp; }&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&amp;nbsp; public ReadWriteArrayProperty1&amp;lt;Dog, int&amp;gt;&lt;DOG, int&gt;&lt;DOG, int&gt;&amp;nbsp;Dogs;&lt;BR&gt;&amp;nbsp; public ReadOnlyArrayProperty1&amp;lt;Cat, string&amp;gt;&lt;CAT, string&gt;&lt;CAT, string&gt;&amp;nbsp;Cats;&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;class Program&lt;BR&gt;{&lt;BR&gt;&amp;nbsp; static void Main(string[] args)&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Animals animals = new Animals();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; animals.Dogs[0] = new Dog("パトラッシュ");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; animals.Dogs[1] = new Dog("ラッシー");&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; animals.Cats["ABC"] = new Cat("たま"); //コンパイルエラー&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;}&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT face="Courier New"&gt;&lt;/FONT&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;みたいなことができます。&lt;/P&gt;
&lt;P&gt;「インデクスが2つ以上ある場合はど～するんや」と突っ込まれそうですが&lt;BR&gt;その場合はK2、K3、&amp;#8230;と型パラメータを増やしたバージョンを追加します。&lt;/P&gt;
&lt;P&gt;私の経験上、インデクスが4つ以上もあるような配列プロパティには、自社開発の&lt;BR&gt;アプリも含めて出合った記憶がありません。&lt;BR&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/umebayashi/aggbug/61500.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>