title: Why Liskov Substitution Principle needs the argument to be contravariant?
body: <p>One of the rules that <a href="https://en.wikipedia.org/wiki/Liskov_substitution_principle" rel="noreferrer">Liskov Substitution Principle</a> imposes on method signature in derived class is:</p>
  
  <blockquote>
    <p>Contravariance of method arguments in the subtype.</p>
  </blockquote>
  
  <p>If I understood correctly, it is saying that the derived class's overridding function should allow contravariant arguments(Supertype arguments). But, I could'nt understand the reason behind this rule. Since LSP talks mostly about dynamically binding the types with there subtypes(rather than supertypes) in order to achieve abstraction, so allowing supertypes as the method arguments in derived class is quite confusing to me.
  My questions are :</p>
  
  <ul>
  <li>Why LSP allows/requires Contravariant arguments in derived class's overridding
  funtion? </li>
  <li>How Contravariance rule is helpful in achieving data/procedure abstraction?</li>
  <li>Is there any real world example where we need to pass contravariant
  parameter to the derived class's overridden method?</li>
  </ul>