Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to force overriding a method in a descendant, without having an abstract base class?

Tags:

c#

.net

oop

Question Heading seems to be little confusing, But I will Try to clear my question here.

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();             }      } } 

Please do not try to understand the whole code. I am summarising it.

  1. Employee is a Abstract class, which have an abstract method GiveBonus
  2. SalesPerson is a deriving from Employee. SalesPerson has to give definition to abstract Method GiveBonus.(SalesPerson can not be Abstract)
  3. PTSalesPerson is deriving from SalesPerson.

Now my question is, How can I force PTSalesPerson to have its own implementation of GiveBonus.

like image 386
Vaibhav Jain Avatar asked Jan 22 '10 14:01

Vaibhav Jain


People also ask

How do you force a method to be overridden?

Just make the method abstract. This will force all subclasses to implement it, even if it is implemented in a super class of the abstract class. Show activity on this post.

Which of the following keywords could be used to force overriding of base class method in derived class method to not make derived class as abstract classes?

virtual keyword: This modifier or keyword use within base class method. It is used to modify a method in base class for overridden that particular method in the derived class.

Is it mandatory to override a base class method in inherited class?

Yes, you need to use the override keyword, otherwise the method will be hidden by the definition in the derived class. If you actually run your code, you will see "Shapes" printed twice.

Is it mandatory to override abstract method in derived class?

It is necessary to override all the methods which are declared as abstract . you cannot skip the non-concrete methods. If you really want to do then make your class as abstract. you cannot change the mechanism of abstraction.


1 Answers

I think you're thinking about this the wrong way. The language designers did not say to themselves "what we really need is a way to mark a method as must be overridden, let's invent this thing called abstract". They said "A virtual method lets us represent the idea that every derived type of this base type should be able to do this method. But what if there is no sensible code that can possibly go in the base class version of the method? I know, let's invent this thing called an abstract method for that circumstance."

That's the problem that abstract methods were intended to solve: you have a method common to all derived classes but no sensible base class implementation, NOT "I need a way to force my derived types to provide an implementation". That derived types are forced to provide an implementation is a consequence of the solution, but not the problem intended to be solved in the first place.

The C# language does not have a mechanism for the problem "I must force my subtype to provide their own implementation of this method" because that's not a problem that the language designers, to my knowledge, ever considered would be a problem for the majority of our customers.

So my question to you is: why do you want to do this? Surely it is up to the developer of the derived class to determine whether or not the base class implementation is correct for the derived class or not. That's not up to you. And even if you did have some way to do that, what would stop the developer from simply saying

override void M() { base.M(); } 

?

Can you explain what purpose you have for attempting to force this work upon the developers of your derived classes? Perhaps there is a better way to achieve what you want.

But more generally: I am not sure that your hierarchy is sensibly designed in the first place. When I see a method GiveBonus on an Employee, I assume that this means that "an employee can give a bonus", not "an employee can receive a bonus". Surely a manager gives a bonus and an employee receives a bonus. I think you might be making the employee hierarchy do too much.

like image 165
Eric Lippert Avatar answered Sep 21 '22 05:09

Eric Lippert