Don’t cast self.
Just make an empty (virtual) base class method (event or function) FireWeapon()
and call that.
Always use the base class without casting.
When you create child weapons, override the FireWeapon()
function but leave the rest of the code as is - no casting, just calling base class methods.
You can go ahead and replace the base class with an interface as @Rev0verDrive suggested if you don’t have any common functionality for the base class.