title: How to override parameter defined in interface method with richer type?
body: <p>I have these:</p>
  
  <pre><code>public class TennisPlayer
  {
  
  }
  
  public class RogerFederer : TennisPlayer
  {
  
  }
  
  public class RafaelNadal : TennisPlayer
  {
  
  }
  </code></pre>
  
  <p>And then I have some classes with methods, like these:</p>
  
  <pre><code>public abstract class Manager
  {
      protected abstract void ScheduleFriendlies(TennisPlayer player);
  }
  
  public class RafaelNadalManager : Manager
  {
      public void ScheduleFriendlies(RafaelNadal rn)
      {
          //throw new NotClayException();
      }
  }
  
  public class RogerFedererManager : Manager
  {
      public void ScheduleFriendlies(RogerFederer rf)
      {
          //throw new NotGrassException();
      }
  }
  
  //'RafaelNadalManager' does not implement inherited abstract member 'Manager.ScheduleFriendlies(TennisPlayer)'
  </code></pre>
  
  <p>The thing I'm trying to achieve is that I would want to have child classes of <code>Manager</code> but every such class will be tied to one player and hence the methods in those child classes (<code>Manager</code> classes) will be specific to that player. In other words <code>Roger</code> should have his own <code>ScheduleFriendlies</code> while <code>Rafael</code> should have his own.</p>
  
  <p><strong>How do I go about this? Alternate designs would do, but keep in mind:</strong></p>
  
  <p><strong>What I can alter</strong>: The inheritances, its routes etc</p>
  
  <p><strong>But do not have the luxury to</strong>: Take off child manager classes and merge into one (in other words, I need <code>RogerFederer</code> and <code>RogerFedererManager</code> as separate classes).</p>
  
  <p><strong>I tried this</strong>:</p>
  
  <pre><code>public abstract class Manager
  {
      protected abstract bool ScheduleFriendlies&lt;T&gt;(T player) where T : TennisPlayer;
  }
  
  public class RafaelNadalManager : Manager
  {
      protected override bool ScheduleFriendlies&lt;T&gt;(T player)
      {
          //but how do I enforce the caller that only RafaelNadal object can be 
          //passed to this but not RogerFederer?
      }
  }
  </code></pre>