// They can't have a constructor without ICritical and you can check that you are getting you own ICritical implementation. public Derived(ICritical critical) : base(critical) { }
public Base(ICritical critical) { if (!(critical is MyOnlyTrueImplementation)) throw ... }
public Weapon(ICritical critical, int damage, int multiplier) { this.critical = critical; this.critical.initialDamage = damage; this.multiplier = multiplier; }