Csharp/C Sharp/Class Interface/Override Virtual
Содержание
- 1 Class hierarchy: override and virtual
- 2 Demonstrate a virtual method
- 3 Demonstrates the use of a virtual method to override a base class method
- 4 Demonstrates the use of a virtual property to override a base class property
- 5 illustrates polymorphism
- 6 Method override 3
- 7 Polymorphism
- 8 Test Polymorphism Virtual Functions
- 9 Use virtual methods and polymorphism
- 10 Virtual and overload
- 11 Virtual keyword can be used to start a new inheritance ladder
- 12 When a virtual method is not overridden, the base class method is used
Class hierarchy: override and virtual
<source lang="csharp"> /*
* 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"); } }
}
</source>
Demonstrate a virtual method
<source lang="csharp"> /* 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(); }
}
</source>
Demonstrates the use of a virtual method to override a base class method
<source lang="csharp"> /* C# Programming Tips & Techniques by Charles Wright, Kris Jamsa Publisher: Osborne/McGraw-Hill (December 28, 2001) ISBN: 0072193794
- /
// // Virtual.cs -- Demonstrates the use of a virtual method to override // a base class method. // // Compile this program with the following command line: // C:>csc Virtual.cs namespace nsVirtual {
using System; public class VirtualclsMain { static public void Main () { clsBase Base = new clsBase(); clsFirst First = new clsFirst(); clsSecond Second = new clsSecond(); Base.Show(); First.Show(); Second.Show (); } } class clsBase { public void Show () { Describe (); } virtual protected void Describe () { Console.WriteLine ("Called the base class Describe() method"); } } class clsFirst : clsBase { override protected void Describe () { Console.WriteLine ("Called the derived class Describe() method"); } } class clsSecond : clsBase { }
}
</source>
Demonstrates the use of a virtual property to override a base class property
<source lang="csharp"> /* C# Programming Tips & Techniques by Charles Wright, Kris Jamsa Publisher: Osborne/McGraw-Hill (December 28, 2001) ISBN: 0072193794
- /
// // VProp.cs -- Demonstrates the use of a virtual method to override // a base class method. // // Compile this program with the following command line: // C:>csc VProp.cs namespace nsVirtual {
using System; public class VPropclsMain { static public void Main () { clsBase Base = new clsBase(); clsFirst First = new clsFirst(); Base.SetString ("This should set the base class property"); First.SetString ("This should set the derived class property"); Console.WriteLine(); Console.WriteLine (Base.GetString()); Console.WriteLine (First.GetString()); } } class clsBase { public void SetString (string str) { StrProp = str; } public string GetString () { return (StrProp); } virtual protected string StrProp { get { Console.WriteLine ("Getting Base string"); return (m_BaseString); } set { Console.WriteLine ("Setting Base string"); m_BaseString = value; } } private string m_BaseString = ""; } class clsFirst : clsBase { override protected string StrProp { get { Console.WriteLine ("Getting derived string"); return (m_DerivedString); } set { Console.WriteLine ("Setting derived string"); m_DerivedString = value; } } private string m_DerivedString = ""; }
}
</source>
illustrates polymorphism
<source lang="csharp"> /* 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(); }
}
</source>
Method override 3
<source lang="csharp"> /* Learning C# by Jesse Liberty Publisher: O"Reilly ISBN: 0596003765
- /
using System; class Dog { private int weight; // constructor public Dog(int weight) { this.weight = weight; } // override Object.ToString public override string ToString() { return weight.ToString(); } }
public class TesterOverride { static void Main() { int i = 5; Console.WriteLine("The value of i is: {0}", i.ToString()); Dog milo = new Dog(62); Console.WriteLine("My dog Milo weighs {0} pounds", milo.ToString()); } } </source>
Polymorphism
<source lang="csharp">
using System; public class MotorVehicle {
public string make; public string model; public MotorVehicle(string make, string model) { this.make = make; this.model = model; } public virtual void Accelerate() { Console.WriteLine(model + " accelerating"); }
} public class Product : MotorVehicle {
public Product(string make, string model) : base(make, model) { } public override void Accelerate() { Console.WriteLine("Pushing gas pedal of " + model); base.Accelerate(); }
} public class Motorcycle : MotorVehicle {
public Motorcycle(string make, string model) : base(make, model) { // do nothing } public override void Accelerate() { Console.WriteLine("Twisting throttle of " + model); base.Accelerate(); }
}
class MainClass {
public static void Main() { Product myProduct = new Product("Toyota", "MR2"); myProduct.Accelerate(); Motorcycle myMotorcycle = new Motorcycle("Harley-Davidson", "V-Rod"); myMotorcycle.Accelerate(); }
}
</source>
Test Polymorphism Virtual Functions
<source lang="csharp"> /* A Programmer"s Introduction to C# (Second Edition) by Eric Gunnerson Publisher: Apress L.P. ISBN: 1-893115-62-3
- /
// 01 - Object-Oriented Basics\Polymorphism and Virtual Functions // copyright 2000 Eric Gunnerson using System; public PolymorphismVirtualFunctions {
public static void CallPlay(MusicServer ms) { ms.Play(); } public static void Main() { MusicServer ms = new WinAmpServer(); CallPlay(ms); ms = new MediaServer(); CallPlay(ms); }
} public abstract class MusicServer {
public abstract void Play();
} public class WinAmpServer: MusicServer {
public override void Play() { Console.WriteLine("WinAmpServer.Play()"); }
} public class MediaServer: MusicServer {
public override void Play() { Console.WriteLine("MediaServer.Play()"); }
}
</source>
Use virtual methods and polymorphism
<source lang="csharp"> /* 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(); } }
}
</source>
Virtual and overload
<source lang="csharp"> /*
* 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"); } }
}
</source>
Virtual keyword can be used to start a new inheritance ladder
<source lang="csharp"> 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()"); }
}
</source>
When a virtual method is not overridden, the base class method is used
<source lang="csharp"> /* 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() }
}
</source>