程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 構建可反轉排序的泛型字典類(7)--實現IDictionary接口(4)

構建可反轉排序的泛型字典類(7)--實現IDictionary接口(4)

編輯:關於C語言

首先注意,全部使用了顯式接口成員實現,也 就是說,只能通過接口調用這些方法。另外它的Item屬性調用了還未實現的 IDictionary<TKey, TValue>接口的Item屬性:

this[(TKey)key] = (TValue)value;

所以需要先把這句屏蔽掉,等最後再釋放出來。另外 調用了兩個新的私有方法,也需要加進去:

private static void VerifyKey(object key)
  {  //檢查key類型是否兼容TKey
     if (key.Equals(null))
    {
      throw new ArgumentNullException("key");
    }
    if (!(key is TKey))
    {  //檢查key是否和TKey兼容。注意,此時 TKey已經被替換為實際類型
      throw new ArgumentException (
        "參數類型錯誤", "key");
    }
  }
  private static void VerifyValueType (object value)
  {  //檢查value類型
    if (!(value is TValue) && ((value != null) || typeof (TValue).IsValueType))
    {
      throw new ArgumentException(
        "參數類型錯誤", "value");
    }
  }

VerifyValueType方法進行類型檢查時有一個奇怪的判斷,這一 點主要是針對C#2.0的可空類型而設的。也就是說,在這裡,空的值類型是合法 的。關於可空類型,可以參考:

http://cgbluesky.blog.163.com/blog/static/241235582008111129264 23/

下面,就剩下IDictionary接口成員方法沒有實現了。其中,由於 Clear()方法同時為IDictionary和ICollection <KeyValuePair<TKey, TValue>>的成員方法,但兩者的返回值和參數完全相同,所以可以共用一 個拷貝:

public void Clear()
  {
     this.version++;
    Array.Clear(this.keys, 0, this._size);
    Array.Clear(this.values, 0, this._size);
     this._size = 0;
  }

剩下的全部為顯式接口成員實現:

void IDictionary.Add(object key, object value)
  {   //做類型檢查再添加
    ReversibleSortedList<TKey, TValue>.VerifyKey(key);
    ReversibleSortedList<TKey, TValue>.VerifyValueType(value);
    this.Add((TKey)key, (TValue)value);
  }
  bool IDictionary.Contains(object key)
  {
    if (ReversibleSortedList<TKey, TValue>.IsCompatibleKey(key))
    {
       return this.ContainsKey((TKey)key);
    }
    return false;
  }
  IDictionaryEnumerator IDictionary.GetEnumerator()
  {
    return new ReversibleSortedList<TKey, TValue>.Enumerator<TKey, TValue>(
        this);
  }
  void IDictionary.Remove(object key)
  {
    if (ReversibleSortedList<TKey, TValue>.IsCompatibleKey(key))
    { //這裡調用了IDictionary<TKey, TValue>接口的Remove方法 ,由於
      //還沒有實現它,所以先把這句屏敝掉
       // this.Remove((TKey)key);
    }
  }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved