F #

2009-11-23 5 views
1

사전 하위 클래스 구현 .Net 세계에 익숙하지 않으며 상속 및 인터페이스가 정확히 작동하는지 파악하려고합니다. 모든 키를 대문자 문자열로 유지하는 Dictionary<string,string>을 구현하려고합니다. F #에서 처음으로 순진한 찌르다는F #

type UpperDictionary1() = 
    inherit Dictionary<string, string>() 
    override this.Add (key: string, value : string) = 
     base.Add(key.ToUpper(), value) 

사전 추가가 봉인되어 있기 때문에 작동하지 않습니다. 그러나 오버 라이드 (및 그림자 추가) 대신 작동하지 않습니다 :

type UpperDictionary2() = 
    inherit Dictionary<string, string>() 
    member this.Add (key: string, value : string) = 
     base.Add(key.ToUpper(), value) 

사전 형식 클래스의 특수 양식을 구현하는 가장 빠르고 가장 효과적인 방법은 무엇입니까?

또한 Google의 Google ForwardingSet과 관련이 있습니다. 포워딩 세트는 이러한 유형의 기능을 추가하는 쉬운 방법일까요? 아니면 요점을 완전히 놓치고 있습니까?

답변

3

내가 원하는 것은 IDictionary 인터페이스를 구현하는 것입니다. 이렇게하면 IDictionary (추가, 제거 등) 유형으로 상호 작용할 수 있으며 대부분의 호출을 개인용 사전 구성원에게 전달할 수 있습니다.

Check this out도 마찬가지입니다.

+2

제거와 같은 모든 메소드를 추가해야하는 것은 과도한 것처럼 보입니다. 하지만 그게 좋은 습관이라고 생각하니? – Tristan

+1

사실,하지만 당신이 비공개 멤버에게 그 메소드를 전달하기 때문에 그렇게 나쁘지 않습니다. 또한 대문자가 아닌 경우 사용자 정의 예외가있는 키를 거부 할 수 있습니다. – emptyset

0

나는이 모범 사례를 모범 사례로 구현하는 것을 보지 못했으며 실제로 컴파일해도 모든 것이 정확하다고는 생각하지 않습니다. 나는 당신 자신의 인터페이스를 만드는 것을 제안 할 것이다.

type UpperDictionary() = 
    let dictionary = new Dictionary<String, String>() 

    interface IDictionary<string, string> with 
     member this.Add(key: string, value : string) = dictionary.Add(key.ToUpper(), value) 
     member this.Add(kvp) = dictionary.Add(kvp.Key.ToUpper(), kvp.Value) 
     member this.ContainsKey(key) = dictionary.ContainsKey(key.ToUpper()) 
     member this.Contains(kvp) = dictionary.TryGetValue(kvp.Key.ToUpper(), ref kvp.Value) 
     member this.Item with get key = dictionary.Item(key) and set key value = dictionary.Item(key) <- value 
     member this.Count with get() = dictionary.Count 
     member this.IsReadOnly with get() = false 
     member this.Keys = dictionary.Keys :> ICollection<String> 
     member this.Remove key = dictionary.Remove(key) 
     member this.Remove(kvp : KeyValuePair<String,String>) = dictionary.Remove(kvp.Key.ToUpper()) 
     member this.TryGetValue(key, value) = dictionary.TryGetValue(key, ref value) 
     member this.Values = dictionary.Values :> ICollection<String> 
     member this.Clear() = dictionary.Clear() 
     member this.CopyTo(array, arrayIndex) = (dictionary :> IDictionary<string, string>).CopyTo(array, arrayIndex) 
     member this.GetEnumerator() = dictionary.GetEnumerator() :> IEnumerator 
     member this.GetEnumerator() = dictionary.GetEnumerator() :> IEnumerator<KeyValuePair<String,String>> 
+0

좋은 .NET 운동이지만. – gradbot

+0

내 두 번째 메서드가 작동하고 두 번째 Add 및 CopyTo 메서드를 추가해야하는 경우 이것이 실제로 권장되는 방법인지 궁금합니다. 정말로 실제 사전에 의해 뒷받침되는 객체를 원한다면 모든 메소드를 구현해야하지만, 몇 가지 추가 기능이 맨 위에 있어야합니다. 이것이 내가 Google의 포워딩 세트에서 수집 한 것입니다. – Tristan

+0

지정한 제약 조건을 적용하려는 경우 접근 방법입니다. 앞서 말했듯이'this.ContainsKey' 나'this.Remove (key)'의 대문자 키만 받아 들일 수도 있습니다. – emptyset