隨風設計

          隨風設計

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            11 隨筆 :: 0 文章 :: 0 評論 :: 0 Trackbacks

          本教程展示如何實現使用索引屬性的類。索引屬性使您可以使用表示類似于數組的若干種不同事物的集合的類。學習本教程以前應完成索引器教程。

          示例文件

          請參見“索引屬性”示例以下載和生成本教程中討論的示例文件。

          教程

          假定您要編寫一個 Document 類,該類封裝非常長的文本章節。為能夠方便地實現各種操作(如檢查拼寫),您可能希望以單詞(以及字符)的虛擬數組形式查看文檔。

          下面的示例展示實現這種類的技術。對于每個“索引屬性”,您定義一個嵌套類,該類包含對主類實例的反向引用。主類上的 readonly 字段提供對嵌套類(定義每個虛擬數組)的實例的訪問。每個嵌套類定義一個索引器以及其他類似集合的方法(例如 Count 屬性)。下面的示例針對“Words”和“Characters”展示這一點。

          注意???請慎重使用該技術!僅在使用數組索引操作提供的抽象化能明確闡明使用您的類的代碼,并且索引器同時具有“獲取”(Get) 和“設置”(Set) 訪問器時,才使用該模式。

          示例

          本示例中定義了 Document 類。使用 WordsCharacters 這兩個索引屬性在 Document 對象上執行某些文本操作。

          // indexedproperty.cs
          using System;
          
          public class Document
          {
              // Type allowing the document to be viewed like an array of words:
              public class WordCollection
              {
                  readonly Document document;  // The containing document
          
                  internal WordCollection(Document d)
                  {
                     document = d;
                  }
          
                  // Helper function -- search character array "text", starting at
                  // character "begin", for word number "wordCount." Returns false
                  // if there are less than wordCount words. Sets "start" and
                  // length" to the position and length of the word within text:
                  private bool GetWord(char[] text, int begin, int wordCount, 
                                                 out int start, out int length) 
                  { 
                      int end = text.Length;
                      int count = 0;
                      int inWord = -1;
                      start = length = 0; 
          
                      for (int i = begin; i <= end; ++i) 
                      {
                          bool isLetter = i < end && Char.IsLetterOrDigit(text[i]);
          
                          if (inWord >= 0) 
                          {
                              if (!isLetter) 
                              {
                                  if (count++ == wordCount) 
                                  {
                                      start = inWord;
                                      length = i - inWord;
                                      return true;
                                  }
                                  inWord = -1;
                              }
                          }
                          else 
                          {
                              if (isLetter)
                                  inWord = i;
                          }
                      }
                      return false;
                  }
          
                  // Indexer to get and set words of the containing document:
                  public string this[int index] 
                  {
                      get 
                      { 
                          int start, length;
                          if (GetWord(document.TextArray, 0, index, out start, 
                                                                    out length))
                              return new string(document.TextArray, start, length);
                          else
                              throw new IndexOutOfRangeException();
                      }
                      set 
                      {
                          int start, length;
                          if (GetWord(document.TextArray, 0, index, out start, 
                                                                   out length)) 
                          {
                              // Replace the word at start/length with the 
                              // string "value":
                              if (length == value.Length) 
                              {
                                  Array.Copy(value.ToCharArray(), 0, 
                                           document.TextArray, start, length);
                              }
                              else 
                              {
                                  char[] newText = 
                                      new char[document.TextArray.Length + 
                                                     value.Length - length];
                                  Array.Copy(document.TextArray, 0, newText, 
                                                                  0, start);
                                  Array.Copy(value.ToCharArray(), 0, newText, 
                                                       start, value.Length);
                                  Array.Copy(document.TextArray, start + length,
                                             newText, start + value.Length,
                                            document.TextArray.Length - start
                                                                      - length);
                                  document.TextArray = newText;
                              }
                          }                    
                          else
                              throw new IndexOutOfRangeException();
                      }
                  }
          
                  // Get the count of words in the containing document:
                  public int Count 
                  {
                      get 
                      { 
                          int count = 0, start = 0, length = 0;
                          while (GetWord(document.TextArray, start + length, 0, 
                                                        out start, out length))
                              ++count;
                          return count; 
                      }
                  }
              }
          
              // Type allowing the document to be viewed like an "array" 
              // of characters:
              public class CharacterCollection
              {
                  readonly Document document;  // The containing document
          
                  internal CharacterCollection(Document d)
                  {
                    document = d; 
                  }
          
                  // Indexer to get and set characters in the containing document:
                  public char this[int index] 
                  {
                      get 
                      { 
                          return document.TextArray[index]; 
                      }
                      set 
                      { 
                          document.TextArray[index] = value; 
                      }
                  }
          
                  // Get the count of characters in the containing document:
                  public int Count 
                  {
                      get 
                      { 
                          return document.TextArray.Length; 
                      }
                  }
              }
          
              // Because the types of the fields have indexers, 
              // these fields appear as "indexed properties":
              public readonly WordCollection Words;
              public readonly CharacterCollection Characters;
          
              private char[] TextArray;  // The text of the document. 
          
              public Document(string initialText)
              {
                  TextArray = initialText.ToCharArray();
                  Words = new WordCollection(this);
                  Characters = new CharacterCollection(this);
              }
          
              public string Text 
              {
                  get 
                  { 
                     return new string(TextArray); 
                  }
              }
          }
          
          class Test
          {
              static void Main()
              {
                  Document d = new Document(
                     "peter piper picked a peck of pickled peppers. How many pickled peppers did peter piper pick?"
                  );
          
                  // Change word "peter" to "penelope":
                  for (int i = 0; i < d.Words.Count; ++i) 
                  {
                      if (d.Words[i] == "peter") 
                          d.Words[i] = "penelope";
                  }
          
                  // Change character "p" to "P"
                  for (int i = 0; i < d.Characters.Count; ++i) 
                  {
                      if (d.Characters[i] == 'p')
                          d.Characters[i] = 'P';
                  }
                  
                  Console.WriteLine(d.Text);
              }
          }

          輸出

          PeneloPe PiPer Picked a Peck of Pickled PePPers. How many Pickled PePPers did PeneloPe PiPer Pick?

          posted on 2006-08-17 11:39 曹賢 閱讀(260) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 霍城县| 义马市| 新和县| 余姚市| 文化| 龙里县| 望江县| 台北市| 庆元县| 阿克| 武穴市| 腾冲县| 岫岩| 浙江省| 尤溪县| 黄浦区| 汪清县| 凯里市| 宜州市| 昭平县| 景德镇市| 沂水县| 蛟河市| 正蓝旗| 西和县| 綦江县| 砀山县| 武胜县| 滨州市| 博野县| 夹江县| 岢岚县| 称多县| 冀州市| 宁陵县| 靖州| 手机| 原平市| 海伦市| 集贤县| 湖北省|