title: How to force overriding a method in a descendant, without having an abstract base class?
body: <p><strong>Question Heading seems to be little confusing, But I will Try to clear my question here.</strong></p>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Text;
  
  namespace ConsoleApplication1
  {
      public abstract class Employee
      {
          private string name;
          private int empid;
          BenefitPackage _BenefitPackage = new BenefitPackage();
          public string Name
           {
               get { return this.name; }
               set { this.name = value; }
              }
          public int EmpId
          {
              get { return this.empid; }
              set
              {
                  if (value == 1)
                      return;
                  this.empid = value; }
          }
          public Employee(string Name, int EmpId)
          {
              this.Name = Name;
              this.EmpId = EmpId;
          }
          public Employee()
          { }
  
          public abstract void GiveBonus();
  
      }
  
      public class Manager : Employee
      {
          private int noofstockoptions;
          public override void GiveBonus()
          {
              Console.WriteLine("Manger GiveBonus Override");
          }
          public int NoOfStockOptions
          {
              get { return this.noofstockoptions; }
              set { this.noofstockoptions = value; }
          }
  
          public Manager(string Name,int EmpId, int NoOfStockOptions):base(Name,EmpId)
          {
              this.NoOfStockOptions=NoOfStockOptions;
          }
  
      }
      public class SalesPerson:Employee
      {
          private int noofsales;
          public int NoOfSales
          {
              get { return this.noofsales; }
              set { this.noofsales = value; }
          }
  
          public SalesPerson(string Name, int EmpId, int NoOfSales):base(Name,EmpId)
          {
              this.NoOfSales = NoOfSales;
          }
          public override void GiveBonus()
          {
              Console.WriteLine("Hi from salesperson");
          }
      }
      public sealed class PTSalesPerson : SalesPerson
      {
          private int noofhrworked;
          public int NoOfHrWorked
          {
              get { return this.noofhrworked; }
              set { this.noofhrworked = value; }
  
          }
          public PTSalesPerson(string Name, int EmpId, int NoOfSales,int NoOfHrWorked):base(Name,EmpId,NoOfSales)
          {
              this.NoOfHrWorked = NoOfHrWorked;
  
          }
          //public new void GiveBonus()
          //{
          //    Console.WriteLine("hi from ptsalesperson");
          //} 
      }
  
      class BenefitPackage
      {
          public int Bonus;
          public int GiveBonus()
          {
              int i = 200;
              return i;
          }
  
          private class innerPublic
          {
              public int innerBonus;
  
          }
  
  
      }
  
      class MainClass
      {
          public static void Main()
          { 
          Manager _Manager=new Manager("Vaibhav",1,50);
          PTSalesPerson _PTSalesPerson = new PTSalesPerson("Shantanu", 1, 4, 6);
          _Manager.GiveBonus();
  
          Employee _emp;
          //_emp = new Employee("new emp",4);
          //_emp.GiveBonus();
          _PTSalesPerson.GiveBonus();
          ((SalesPerson)_PTSalesPerson).GiveBonus();
          Console.ReadLine();    
          }
  
      }
  }
  </code></pre>
  
  <p><strong>Please do not try to understand the whole code.</strong> I am summarising it.<br></p>
  
  <ol>
  <li>Employee is a Abstract class, which have an abstract method GiveBonus<br></li>
  <li>SalesPerson is a deriving from Employee. SalesPerson has to give definition to abstract Method GiveBonus.(<strong>SalesPerson can not be Abstract</strong>)<br></li>
  <li>PTSalesPerson is deriving from SalesPerson.</li>
  </ol>
  
  <p><strong>Now my question is, How can I <em>force</em> PTSalesPerson to have its own implementation of GiveBonus.</strong></p>