Можна було б визначити інтерфейс для функції пошуку ключів словника. Я, мабуть, визначив це як щось подібне:
Interface IKeyLookup(Of Out TValue)
Function Contains(Key As Object)
Function GetValueIfExists(Key As Object) As TValue
Function GetValueIfExists(Key As Object, ByRef Succeeded As Boolean) As TValue
End Interface
Interface IKeyLookup(Of In TKey, Out TValue)
Inherits IKeyLookup(Of Out TValue)
Function Contains(Key As TKey)
Function GetValue(Key As TKey) As TValue
Function GetValueIfExists(Key As TKey) As TValue
Function GetValueIfExists(Key As TKey, ByRef Succeeded As Boolean) As TValue
End Interface
Версія з не-загальними ключами дозволила б коду, який використовував код, використовуючи неструктурні типи ключів, щоб дозволити довільну дисперсію ключів, що було б неможливо з загальним параметром типу. Не можна допускати використання мутанта Dictionary(Of Cat, String)
як мутабеля, Dictionary(Of Animal, String)
оскільки це дозволить SomeDictionaryOfCat.Add(FionaTheFish, "Fiona")
. Але немає нічого поганого в тому, щоб використовувати мутант Dictionary(Of Cat, String)
як незмінний Dictionary(Of Animal, String)
, оскільки його SomeDictionaryOfCat.Contains(FionaTheFish)
слід вважати ідеально добре сформованим виразом (він повинен повертатися false
, не потребуючи пошуку словника, нічого, що не має типу Cat
).
На жаль, єдиний спосіб реально використовувати такий інтерфейс - це якщо обернути Dictionary
об’єкт у класі, який реалізує інтерфейс. Однак, залежно від того, чим ви займаєтесь, такий інтерфейс та відхилення, яке він дозволяє, можуть зробити вартими зусиль.