When designing an item system, or in reality any system requiring collections of whatever, you should begin by considering what type of functionality is shared by all objects in these collections. For instance, all items may need to be rendered to the screen, all items have a quantity, all items require collision detection, etc. So starting with this, begin creating base classes that contain the similar functionality between items, but allow for unique derivations for customized behavior. Here is an example, written in pseudo code.
This first class represents a base class called Item, which would extend the abstract class renderable. Whenever extending from another class, always ensure you consider whether or not your class "Is A" or "Contains A". For instance, an item "Is A" renderable object, or does it "Contain A" renderable object. Depending on your architecture, this could be different.
This item class implements basic functionality and variables that would be common to all types of items, such as a name, quantity, and the callback OnCollision that is triggered whenever something collides with it.
class item implements renderable
Next is the item class Banana, which is extended from Item. Notice i specified override for the functions within banana, meaning that it is receiving this base functionality from item, but is choosing to override it to provide customized behavior based on whatever banana needs to do.
class Banana implements item