not abstract, but sealed. use delegate to get the key of an item.