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.
Now my question is, How can I force PTSalesPerson to have its own implementation of GiveBonus.
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.
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.
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With