Yeah, keeping it simpler is the way to go.
In Kharne, I have a TItem class, and Weapons are just a particular instance of TItem (with the member field FItemType set to 'iWeapon'). Where I differ slightly is that Magical Items have a number of instances of a class known as TItemEnchantment, attached to them. It is these that give them their properties.
For example, a Long Sword [+1,0] has a TItemEnchantment that gives a +1 to hit. A Long Sword [+1, +1] has two Enchantments, one the +1 to hit, and another that gives +1 to damage. A Long Sword [+1, +1] of Fire Resistance has, yes, a third enchantment as well, one that gives Fire Resistance. And so on. Each enchantment has a magnitude as well (which is dependent upon the level of the item). If an item is cursed, then these enchantment magnitudes are reversed.
Different tiers of magical items have different numbers and sizes of enchantments (yes, I completely ripped that off from WoW), and certain magical item types are predisposed to certain enchantments.
The Enchantment details are stored in a table in an SQLLite Database, and stored in a master list of TItemEnchantments, which I merely need to set up pointers to for the items. Both TItem and TItemEnchantment have common interfaces for producing a unique string value that can be saved to disk to represent uniquely the combination of Item and Enchantment.