将父类的方法标记为虚方法 ,使用关键字 virtual,这个函数可以被子类重新写一个遍。
点击(此处)折叠或打开
- namespace _10多态练习
- {
- class Program
- {
- static void Main(string[] args)
- {
- RealDuck rd = new RealDuck();
- MuDuck md = new MuDuck();
- XPDuck xd = new XPDuck();
- RealDuck[] ducks = { rd, md, xd };
- for (int i = 0; i < ducks.Length; i++)
- {
- ducks[i].Bark();
- }
- Console.ReadKey();
- }
- }
- public class RealDuck
- {
- public virtual void Bark()
- {
- Console.WriteLine("真的鸭子嘎嘎叫");
- }
- }
- public class MuDuck : RealDuck
- {
- public override void Bark()
- {
- Console.WriteLine("木头鸭子吱吱叫");
- }
- }
- public class XPDuck : RealDuck
- {
- public override void Bark()
- {
- Console.WriteLine("橡皮鸭子唧唧叫");
- }
- }
- }
2.抽象类
当父类中的方法不知道如何去实现的时候,可以考虑将父类写成抽象类,将方法写成抽象方法。
点击(此处)折叠或打开
- namespace _12_抽象类
- {
- class Program
- {
- static void Main(string[] args)
- {
- //使用多态求矩形的面积和周长以及圆形的面积和周长
- Shape shape = new Square(5, 6); //new Circle(5);
- double area = shape.GetArea();
- double perimeter = shape.GetPerimeter();
- Console.WriteLine("这个形状的面积是{0},周长是{1}", area, perimeter);
- Console.ReadKey();
- }
- }
- public abstract class Shape
- {
- public abstract double GetArea();
- public abstract double GetPerimeter();
- }
- public class Circle : Shape
- {
- private double _r;
- public double R
- {
- get { return _r; }
- set { _r = value; }
- }
- public Circle(double r)
- {
- this.R = r;
- }
- public override double GetArea()
- {
- return Math.PI * this.R * this.R;
- }
- public override double GetPerimeter()
- {
- return 2 * Math.PI * this.R;
- }
- }
- public class Square : Shape
- {
- private double _height;
- public double Height
- {
- get { return _height; }
- set { _height = value; }
- }
- private double _width;
- public double Width
- {
- get { return _width; }
- set { _width = value; }
- }
- public Square(double height, double width)
- {
- this.Height = height;
- this.Width = width;
- }
- public override double GetArea()
- {
- return this.Height * this.Width;
- }
- public override double GetPerimeter()
- {
- return (this.Height + this.Width) * 2;
- }
- }
- }