Inheritance hierarchies support flexibile implementation by allowing substitution, in a method's calling arguments,
of a base reference by a reference to an instance of any derived type. See methods doOps and doOp, in class TestPeople, below.
/////////////////////////////////////////////////////////////////////
// InheritanceDemo.cs - demonstrates basic inheritance //
// //
// Jim Fawcett, CSE681 - Software Modeling and Analysis, Fall 2017 //
/////////////////////////////////////////////////////////////////////
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace InheritanceDemo
{
///////////////////////////////////////////////////////////////////
// Person class is base for inheritance hierarchy
public class Person
{
public string name { get; set; } = "basic person";
public Action methodToExecute { get; set; }
public virtual void eat()
{
Console.Write("\n {0} is eating", name);
}
public virtual void sleep()
{
Console.Write("\n {0} is sleeping", name);
}
}
///////////////////////////////////////////////////////////////////
// Soldier is a Person and is base for Soldier hierarchy
public class Soldier : Person
{
public Soldier(string myName = "soldier")
{
name = myName;
}
public List<string> gear { get; set; } = new List<string>();
public virtual void salute()
{
Console.Write("\n {0} saluting superior officer", name);
}
public virtual void inspection()
{
Console.Write("\n {0} is participating in an inspection", name);
}
}
///////////////////////////////////////////////////////////////////
// Captain class - top rank Soldier for this example
public class Captain : Soldier
{
public Captain(string myName)
{
name = myName;
}
public override void salute()
{
Console.Write("\n casual salute");
}
public override void inspection()
{
Console.Write("\n Captain {0} is inspecting his platoon", name);
salute();
}
}
///////////////////////////////////////////////////////////////////
// Private is a lowly Soldier
public class Private : Soldier
{
public Private(string myName)
{
name = myName;
}
public override void salute()
{
Console.Write("\n snappy salute");
}
public override void inspection()
{
Console.Write("\n {0} presents his equipment for inspection:", name);
salute();
if (gear.Count > 0)
{
foreach(var item in gear)
{
Console.Write("\n {0} presents {1}", name, item);
}
}
else
{
Console.Write("\n Sorry sir, I forgot my equipment");
}
}
}
///////////////////////////////////////////////////////////////////
// Sergeant is the Soldier that gets everything done
public class Sergeant : Soldier
{
public Sergeant(string myName)
{
name = myName;
}
public override void salute()
{
Console.Write("\n brisk salute");
}
public override void inspection()
{
Console.Write("\n Sergeant {0} presents his platoon", name);
salute();
}
}
///////////////////////////////////////////////////////////////////
// TestPeople class demonstrates the hierarchy
class TestPeople
{
private Captain captain;
private Sergeant sergeant;
private List<Person> enlisted = new List<Person>();
public void doOps(string methodName)
{
doOp(captain, methodName);
doOp(sergeant, methodName);
foreach(Soldier dogface in enlisted)
{
doOp(dogface, methodName);
}
}
public void doOp(Soldier soldier , string methodName)
{
switch (methodName)
{
case "sleep":
soldier.sleep();
break;
case "eat":
soldier.eat();
break;
case "salute":
soldier.salute();
break;
case "inspection":
soldier.inspection();
break;
default:
break;
}
}
static void Main(string[] args)
{
Console.Write("\n Demonstrating inheritance");
Console.Write("\n ===========================");
TestPeople tp = new TestPeople();
Private sam = new Private("Sam");
sam.gear.Add("M16 rifle");
sam.gear.Add("Field Pack");
tp.enlisted.Add(sam);
Private george = new Private("George");
george.gear.Add("50 Caliber Machinegun");
george.gear.Add("Field Pack");
tp.enlisted.Add(george);
Private slacker = new Private("Slacker");
tp.enlisted.Add(slacker);
tp.sergeant = new Sergeant("Gonsales");
tp.sergeant.gear.Add("M16 Carbine");
tp.sergeant.gear.Add("Field Pack");
tp.captain = new Captain("Wang");
tp.captain.gear.Add("45 Caliber pistol");
Console.Write("\n The night before inspection:");
tp.doOps("sleep");
Console.Write("\n The morning of inspection:");
tp.doOps("eat");
Console.Write("\n The inspection:");
tp.doOps("inspection");
Console.Write("\n\n");
}
}
}