Definitely do not do Type Checking here.
The big question is why are you dealing with the Weapon type and then calling StartCharging on it in your Game class? This code assumes that all tools implement StartCharging - if they do not, then you have already disagreed with good OO practices.
Instead, I would create an abstract method like Initialise for a weapon. - In your Concrete Weapon classes, implement this in different ways - for example. for ChargedWeapon you should use:
public override void Initialise() { StartCharging(); }
for different weapons, the implementation will be different, for example. With a HolsteredWeapon it could be:
public override void Initialise() { DrawWeapon(); }
In this example, only the ChargedWeapon classes should contain the StartCharging() method, and only the HolsteredWeapon classes should contain the DrawWeapon() method. However, each weapon needs an Initialise method.
Now the base type contains only methods that apply to all specific implementations, so again we follow the good principles of OO.
source share