多态——抽象类
1.抽象成员必须标记为abstract,并且不能有任何实现。
2.抽象成员必须在抽象类中。
3.抽象类不能被实例化
4.子类继承抽象类后,必须把父类中的所有抽象成员都重写。
(除非子类也是一个抽象类,则可以不重写)
5.抽象成员的访问修饰符不能是private
6.在抽象类中可以包含实例成员。
并且抽象类的实例成员可以不被子类实现
7.抽象类是有构造函数的。虽然不能被实例化。
8、如果父类的抽象方法中有参数,那么。继承这个抽象父类的子类在重写父类的方法的时候必须传入对应的参数。
如果抽象父类的抽象方法中有返回值,那么子类在重写这个抽象方法的时候 也必须要传入返回值。
如果父类中的方法有默认的实现,并且父类需要被实例化,这时可以考虑将父类定义成一个普通类,用虚方法来实现多态。
如果父类中的方法没有默认实现,父类也不需要被实例化,则可以将该类定义为抽象类。
案例:多态-抽象类:使用多态的方法求圆形和矩形的面积和周长
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
namespace 多态_抽象类 { class Program {//注意抽象类父类 子类方法的返回值类型 接受的类型要一致 static void Main(string[] args) { Shape s = new Rectangle(3,4);//父类调用矩形子类对象-执行子类的构造函数 double area= s.GetArea(); double length = s.GetPerimeter(); Shape k = new Circle(5);//父类调用圆形子类对象-执行子类的构造函数 double are = k.GetArea(); double leg = k.GetPerimeter(); Console.WriteLine("矩形面积是{0}周长是{1}",area,length); Console.WriteLine("圆形面积是{0}周长是{1}", are, leg); Console.ReadKey(); } } public abstract class Shape//定义抽象类 { public abstract double GetArea();//抽象类方法没有方法体 public abstract double GetPerimeter(); } public class Rectangle:Shape//如果子类继承父类的抽象类则必须重载父类的成员 { private double _width;//矩形的长 public double Width { get { return _width; } set { _width = value; } } private double _hight;//矩形的高 public double Hight { get { return _hight; } set { _hight = value; } } public Rectangle(double width,double height) { this.Width = width; this.Hight = height; }//创建了子类的构造函数(初始化属性) public override double GetArea() { return this.Width * Hight; } public override double GetPerimeter() { return (this.Width + this.Hight)*2; } } 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 this.R * Math.PI * this.R; } public override double GetPerimeter() { return this.R * 2 * Math.PI; } } } |