2012-05-19 10 views
0

SortedList를 확장하는 클래스가 있습니다. Add() 및 Remove()와 같은 클래스에서 많은 SortedList 메서드를 사용할 수 있지만 GetKey()를 사용하려고 할 때 어떤 이유로 든 그것을 좋아하지 않습니다. 왜 이런 일이 일어날 지 말해 줄 수 있습니까?SortedList를 확장 할 때 특정 메서드를 사용할 수 없습니다.

public class SymbolTableImplementation : SortedList<string, SymbolTableEntry>, SymbolTable 
{ 
    public SymbolTableEntry Enter(string name) 
    { 
     SymbolTableEntry entry = SymbolTableFactory.CreateSymbolTableEntry(name, this); 
     Add(name, entry); // This is OK 
     return entry; 
    } 

    // Look up an existing symbol table entry. Null if it does not exist. 
    public SymbolTableEntry Lookup(string name) 
    { 
     return GetKey(name); // Doesn't exist in current context 
    } 
} 
+0

-1 "이게 맘에 안 든다"고 말할 때 무슨 뜻인지 알려주지 않으려 고합니다. –

답변

3

GetKeySortedList으로 정의되며 실제로는 SortedList<TKey, TValue>과는 완전히 별개입니다. 또한 원래 코드에 실수가 있습니다. 당신 라면 실제로 GetKey/SortedList를 사용하여,이 컴파일하지 않았을 :

return GetKey(name); 

는 대신에, 단지 IDictionary 인덱서 사용

return this[name]; 
+0

잘 자랍니다. SortedList에는 두 가지 유형이 있다는 것을 전혀 눈치 채지 못했습니다. 그것이 작동하지 않는 이유를 설명합니다. –

+0

좋아요,'return Keys [name];'이 작동하지 않습니다. 그것은 '문자열에서 int로 변환 할 수 없습니다.'라고 말합니다. –

+0

자, 이제 말하는 것입니다 : 암시 적으로 'string'유형을 'Interpreter.intermediate.SymbolTableEntry'로 변환 할 수 없습니다. –

2

SortedList<TKey, TValue> 클래스의 이름 GetKey 아무 방법도 없다.

2

아니하는 getKey()를, 즉 이미 분명하다. 적절한 구현은 다음과 같습니다.

일시 중지해야하는 것은 불필요합니다. SortedList의 인덱서는 이미 작업을 완료하기에 충분합니다. 이 메서드를 제거하면이 클래스의 사용자는 사용할 클래스를 추측 할 수 없습니다.

Add() v Enter()와 비슷한 문제가 있음을 유의하십시오. 클라이언트 프로그래머가 Add()를 사용할 때 좋은 점이 전혀 없습니다. 당신이 정말로하고 싶은 것은 을 대체하거나 Add() 메소드를 숨기는 것이 가능하지 않습니다. 당신은 그것을 과부하시킬 수 있지만 가능한 멀리 갈 수 있습니다.

.NET 컬렉션 클래스는 실제로 파생되지 않도록 설계되어 있지만 해당 메서드는 가상이 아닙니다. 을 캡슐화하고 IDictionary를 상속받은 자신 만의 컬렉션 클래스를 만들고 개인 SortedList를 사용하여 작업을 완료하면 더 잘 작동합니다. 그것은 상당한 양의 작업이지만 삐걱 거리는 소리가납니다.

+0

예, hadn 그것이 사전이라는 것을 깨달았습니다. 좋은 캐치! –

관련 문제