/* Mastering Visual C# .NET by Jason Price, Mike Gunderloy Publisher: Sybex; ISBN: 0782129110 */ /* Example7_2.cs illustrates polymorphism */ using System; // declare the MotorVehicle class class MotorVehicle { // declare the fields public string make; public string model; // define a constructor public MotorVehicle(string make, string model) { this.make = make; this.model = model; } // define the Accelerate() method (may be overridden in a // derived class) public virtual void Accelerate() { Console.WriteLine(model + " accelerating"); } } // declare the Car class (derived from MotorVehicle) class Car : MotorVehicle { // define a constructor public Car(string make, string model) : base(make, model) { // do nothing } // override the base class Accelerate() method public override void Accelerate() { Console.WriteLine("Pushing gas pedal of " + model); base.Accelerate(); // calls the Accelerate() method in the base class } } // declare the Motorcycle class (derived from MotorVehicle) class Motorcycle : MotorVehicle { // define a constructor public Motorcycle(string make, string model) : base(make, model) { // do nothing } // override the base class Accelerate() method public override void Accelerate() { Console.WriteLine("Twisting throttle of " + model); base.Accelerate(); // calls the Accelerate() method in the base class } } public class Example7_2 { public static void Main() { // create a Car object and call the object's Accelerate() method Car myCar = new Car("Toyota", "MR2"); myCar.Accelerate(); // create a Motorcycle object and call the object's Accelerate() method Motorcycle myMotorcycle = new Motorcycle("Harley-Davidson", "V-Rod"); myMotorcycle.Accelerate(); } }
Month: February 2011
When a virtual method is not overridden, the base class method is used
/* C#: The Complete Reference by Herbert Schildt Publisher: Osborne/McGraw-Hill (March 8, 2002) ISBN: 0072134852 */ /* When a virtual method is not overridden, the base class method is used. */ using System; class Base { // Create virtual method in the base class. public virtual void who() { Console.WriteLine("who() in Base"); } } class Derived1 : Base { // Override who() in a derived class. public override void who() { Console.WriteLine("who() in Derived1"); } } class Derived2 : Base { // This class does not override who(). } public class NoOverrideDemo { public static void Main() { Base baseOb = new Base(); Derived1 dOb1 = new Derived1(); Derived2 dOb2 = new Derived2(); Base baseRef; // a base-class reference baseRef = baseOb; baseRef.who(); baseRef = dOb1; baseRef.who(); baseRef = dOb2; baseRef.who(); // calls Base's who() } }
Demonstrate a virtual method
/* C#: The Complete Reference by Herbert Schildt Publisher: Osborne/McGraw-Hill (March 8, 2002) ISBN: 0072134852 */ // Demonstrate a virtual method. using System; class Base { // Create virtual method in the base class. public virtual void who() { Console.WriteLine("who() in Base"); } } class Derived1 : Base { // Override who() in a derived class. public override void who() { Console.WriteLine("who() in Derived1"); } } class Derived2 : Base { // Override who() again in another derived class. public override void who() { Console.WriteLine("who() in Derived2"); } } public class OverrideDemo { public static void Main() { Base baseOb = new Base(); Derived1 dOb1 = new Derived1(); Derived2 dOb2 = new Derived2(); Base baseRef; // a base-class reference baseRef = baseOb; baseRef.who(); baseRef = dOb1; baseRef.who(); baseRef = dOb2; baseRef.who(); } }
Use virtual methods and polymorphism
/*
C#: The Complete Reference
by Herbert Schildt
Publisher: Osborne/McGraw-Hill (March 8, 2002)
ISBN: 0072134852
*/
// Use virtual methods and polymorphism.
using System;
class TwoDShape {
double pri_width; // private
double pri_height; // private
string pri_name; // private
// A default constructor.
public TwoDShape() {
width = height = 0.0;
name = “null”;
}
// Parameterized constructor.
public TwoDShape(double w, double h, string n) {
width = w;
height = h;
name = n;
}
// Construct object with equal width and height.
public TwoDShape(double x, string n) {
width = height = x;
name = n;
}
// Construct an object from an object.
public TwoDShape(TwoDShape ob) {
width = ob.width;
height = ob.height;
name = ob.name;
}
// Properties for width, height, and name
public double width {
get { return pri_width; }
set { pri_width = value; }
}
public double height {
get { return pri_height; }
set { pri_height = value; }
}
public string name {
get { return pri_name; }
set { pri_name = value; }
}
public void showDim() {
Console.WriteLine(“Width and height are ” +
width + ” and ” + height);
}
public virtual double area() {
Console.WriteLine(“area() must be overridden”);
return 0.0;
}
}
// A derived class of TwoDShape for triangles.
class Triangle : TwoDShape {
string style; // private
// A default constructor.
public Triangle() {
style = “null”;
}
// Constructor for Triangle.
public Triangle(string s, double w, double h) :
base(w, h, “triangle”) {
style = s;
}
// Construct an isosceles triangle.
public Triangle(double x) : base(x, “triangle”) {
style = “isosceles”;
}
// Construct an object from an object.
public Triangle(Triangle ob) : base(ob) {
style = ob.style;
}
// Override area() for Triangle.
public override double area() {
return width * height / 2;
}
// Display a triangle's style.
public void showStyle() {
Console.WriteLine(“Triangle is ” + style);
}
}
// A derived class of TwoDShape for rectangles.
class Rectangle : TwoDShape {
// Constructor for Rectangle.
public Rectangle(double w, double h) :
base(w, h, “rectangle”){ }
// Construct a square.
public Rectangle(double x) :
base(x, “rectangle”) { }
// Construct an object from an object.
public Rectangle(Rectangle ob) : base(ob) { }
// Return true if the rectangle is square.
public bool isSquare() {
if(width == height) return true;
return false;
}
// Override area() for Rectangle.
public override double area() {
return width * height;
}
}
public class DynShapes {
public static void Main() {
TwoDShape[] shapes = new TwoDShape[5];
shapes[0] = new Triangle(“right”, 8.0, 12.0);
shapes[1] = new Rectangle(10);
shapes[2] = new Rectangle(10, 4);
shapes[3] = new Triangle(7.0);
shapes[4] = new TwoDShape(10, 20, “generic”);
for(int i=0; i < shapes.Length; i++) { Console.WriteLine("object is " + shapes[i].name); Console.WriteLine("Area is " + shapes[i].area()); Console.WriteLine(); } } } [/csharp]
Class hierarchy: override and virtual
/* * C# Programmers Pocket Consultant * Author: Gregory S. MacBeth * Email: gmacbeth@comporium.net * Create Date: June 27, 2003 * Last Modified Date: */ using System; namespace Client.Chapter_5___Building_Your_Own_Classes { public class MyMainClass13 { static void Main(string[] args) { //The function called is based //upon the type called by new. B MyB = new C(); MyB.Display(); //Calls C's Display } } abstract class A { public abstract void Display(); } class B: A { public override void Display() { Console.WriteLine("Class B's Display Method"); } } class C: B { public override void Display() { Console.WriteLine("Class C's Display Method"); } } class D: C { public override void Display() { Console.WriteLine("Class D's Display Method"); } } }
Virtual and overload
/* * C# Programmers Pocket Consultant * Author: Gregory S. MacBeth * Email: gmacbeth@comporium.net * Create Date: June 27, 2003 * Last Modified Date: */ using System; namespace Client.Chapter_5___Building_Your_Own_Classes { public class MyMainClass12 { static void Main(string[] args) { //The function called is based //upon the type called by new. B MyB = new C(); D MyD = new D(); MyB.Display(); //Calls C Display MyD.Display(); //Calls D Display } } public interface A { void Display(); } class B: A { public virtual void Display() { Console.WriteLine("Class B's Display Method"); } } class C: B { public override void Display() { Console.WriteLine("Class C's Display Method"); } } class D: C { public override void Display() { Console.WriteLine("Class D's Display Method"); } } }
Virtual keyword can be used to start a new inheritance ladder
using System; public class Class1 { public static void Main(string[] strings) { BankAccount ba = new BankAccount(); Test1(ba); SavingsAccount sa = new SavingsAccount(); Test1(sa); Test2(sa); SpecialSaleAccount ssa = new SpecialSaleAccount(); Test1(ssa); Test2(ssa); Test3(ssa); SaleSpecialCustomer ssc = new SaleSpecialCustomer(); Test1(ssc); Test2(ssc); Test3(ssc); Test4(ssc); } public static void Test1(BankAccount account) { Console.Write("to Test(BankAccount)"); account.Withdrawal(100); } public static void Test2(SavingsAccount account) { Console.Write("to Test(SavingsAccount)"); account.Withdrawal(100); } public static void Test3(SpecialSaleAccount account) { Console.Write("to Test(SpecialSaleAccount)"); account.Withdrawal(100); } public static void Test4(SaleSpecialCustomer account) { Console.Write("to Test(SaleSpecialCustomer)"); account.Withdrawal(100); } } public class BankAccount { virtual public void Withdrawal(double dWithdrawal) { Console.WriteLine(" invokes BankAccount.Withdrawal()"); } } public class SavingsAccount : BankAccount { override public void Withdrawal(double dWithdrawal) { Console.WriteLine(" invokes SavingsAccount.Withdrawal()"); } } public class SpecialSaleAccount : SavingsAccount { new virtual public void Withdrawal(double dWithdrawal) { Console.WriteLine(" invokes SpecialSaleAccount.Withdrawal()"); } } public class SaleSpecialCustomer : SpecialSaleAccount { override public void Withdrawal(double dWithdrawal) { Console.WriteLine (" invokes SaleSpecialCustomer.Withdrawal()"); } }