2014-06-26 33 views
0

我有一個類稱爲MAP:Eiffel MAP上的Iterable實現?

class MAP [KEY,VAL] 
     inherit ITERABLE [KEY] 

我實現地圖光標返回和

MAP_ITERATOR_CURSOR [KEY] 

內新的光標並傳遞可迭代光標鍵的陣列通過

迭代

我實施了MAP_ITERATOR_CURSOR [KEY]

class MAP_ITERATOR_CURSOR [KEY] 
     inherit ITERATION_CURSOR [KEY] 

這個班級我實現了功能項目:VAL,但因爲班級是使用KEY定義的,所以它不會識別VAL如何獲得MAP_ITERATOR_CURSOR [KEY]項目功能返回VAL與我們目前使用的鑰匙相關?

明知MAP具有采取一個函數調用項目鍵並返回與該鍵

item (k: KEY): VAL 

回答

2

只要MAP [KEY, VAL]繼承ITERABLE [KEY],的ITERATION_CURSOR通用參數綁定到KEY。然而{ITERATION_CURSOR}.item僅僅是一個正常的特點,那就是受重聲明,重命名等,因此幾種方法能適合您的需要:

  1. 聲明MAP_ITERATOR_CURSOR有兩個正式的仿製藥,並宣佈{MAP}.new_cursor如下:

    class MAP [KEY, VAL] inherit ITERABLE [KEY] feature 
        new_cursor: MAP_ITERATOR_CURSOR [KEY, VAL] 
         do 
          create Result.make (Current) 
         end 
    end 
    
    class MAP_ITERATOR_CURSOR [KEY, VAL] inherit ITERATION_CURSOR [KEY] 
    create make 
    feature 
        make (t: like target) 
         do 
          target := t 
         end 
        target: MAP [KEY, VAL] 
        item: KEY ... 
        value: VAL 
         do 
          Result := target.item (item) 
         end 
    end 
    

    然後客戶端代碼可以看成

    across map as c loop 
        -- Use `c.item` of type KEY. 
        -- Use `c.value` of type VAL. 
    end 
    
  2. 如果要求{MAP_ITERATOR_CURSOR}.itemVAL類型,第一種方式是使用完全相同的代碼之上,但重命名功能item是來自ITERABLE

    class MAP_ITERATOR_CURSOR [KEY, VAL] inherit 
        ITERATION_CURSOR [KEY] rename item as key end 
    ... 
        key: KEY ... 
        item: VAL 
         do 
          Result := target.item (key) 
         end 
    end 
    

    然後客戶端代碼可以看成

    across map as c loop 
        -- Use `c.item` of type VAL. 
        -- Use `c.key` of type KEY. 
    end 
    
  3. 的迭代可以從一開始就對VAL類型的項目執行。在這種情況下,實際通用的ITERABLE應該VAL

    class MAP [KEY, VAL] inherit ITERABLE [VAL] feature 
        new_cursor: MAP_ITERATOR_CURSOR [KEY, VAL] 
         do 
          create Result.make (Current) 
         end 
    end 
    
    class MAP_ITERATOR_CURSOR [KEY, VAL] inherit ITERATION_CURSOR [VAL] 
    create make 
    feature 
        make (t: like target) 
         do 
          target := t 
         end 
        target: MAP [KEY, VAL] 
        item: VAL 
         do 
          Result := target.item (key) 
         end 
        key: KEY 
          -- This feature can be not exported, or even not present 
          -- as soon as `item` can be implemented. 
    end 
    

    客戶端代碼類似案例2中,但key可能不可用:

    across map as c loop 
        -- Use `c.item` of type VAL. 
    end 
    
  4. 在3正式通用KEYMAP_ITERATION_CURSOR爲了方便而保留。如果有某種方式可以訪問MAP的項目,則可以將其刪除,但這可能會引起與訪問MAP,一致性和CAT-calls有關的其他一些問題。因此,儘管這可能是可行的,但我不會爲此付出代價。

+0

這是一個非常棒的解決方案,非常感謝 –