a)抽象类与抽象方法由abstract修饰
b)abstract的使用注意
抽象方法没有方法体
抽象成员只能存在于抽象类中
抽象类可以有非抽象成员(侧重于族群的概念,父类有的,子类可以调用)
抽象类的派生类必须实现抽象方法体
抽象类可以有构造函数(子类new时会调用父类构造函数初始化)
抽象类只能用作基类,无法实例化
抽象类
a)抽象类不能被实例化。
b)抽象类存在的意义:
1.抽象类不能被实例化,只能被其他类继承
2.继承抽象类的子类必须把抽象类中的所有抽象成员都重写(实现)(除非子类也是抽象类。)
3.抽象类就是为了重写→多态。
c)什么是抽象类(光说不做)
不能被实例化的类(不能new)
d)抽象类的特点
1.需要用abstract关键字标记
2.抽象方法不能有任何方法实现。
3.抽象成员必须包含在抽象类中。
4.由于抽象成员没有任何实现,所以子类必须将抽象成员重写。
5.抽象类不能实例化
6.抽象类中可以包括抽象成员,可以包括有具体代码的成员。
7.抽象方法不能用static修饰
8.抽象类中的抽象成员不能使用private访问修饰符,可以使用其他访问修饰符。
e)抽象类的作用:抽象类的作用就是为了让子类继承。
抽象类定义的是公共的实现和能力
抽象类为子类提供所需要的成员
抽象类中的成员既可以有实现也可以无实现
抽象类必须由其子类实现它的抽象成员(除非子类也是抽象类)
一个类只能继承一个抽象类(类的单根继承性)
抽象方法(成员)不能有实现,必须被子类重写override(除非子类也是抽象类)
抽象方法(成员)只能出现在抽象类中。
现在,我们再来看多态。
多态性的含义:使得能够利用基类来操作不同子类的对象,以及根据所操作对象的不同,以不同的方式执行相同的操作。
多态的作用:把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。建立多态的方式:用父类实现多态;用抽象类实现多态;用接口实现多态。
下面的例子中,Shape类为抽象类,它包含了3个抽象方法。它的子类Circle和Square都对这3个抽象方法进行了重写。
1 //父类:Shape 2 public abstract class Shape 3 { //设置形状的参数 4 public abstract void SetR(); 5 6 //获得形状面积 7 public abstract double CountArea(); 8 9 //获得形状周长 10 public abstract double CountLength(); 11 } 12 13 //子类:Circle 14 public class Circle : Shape 15 { 16 double r; 17 const double PI = 3.14; 18 19 //设置形状的参数 20 public override void SetR() 21 { 22 Console.WriteLine("请输入您的圆形的半径:"); 23 string strR = Console.ReadLine(); 24 r = Convert.ToDouble(strR); 25 } 26 27 //计算圆的面积 28 public override double CountArea() 29 { 30 return PI * r * r; 31 } 32 33 //计算圆的周长 34 public override double CountLength() 35 { 36 return 2 * PI * r; 37 } 38 } 39 40 //子类:Square 41 public class Square : Shape 42 { 43 double width; 44 double height; 45 46 // 设置形状的参数 47 public override void SetR() 48 { 49 Console.WriteLine("请输入您的矩形的宽:"); 50 string strWidth = Console.ReadLine(); 51 width = Convert.ToDouble(strWidth); 52 53 Console.WriteLine("请输入您的矩形的高:"); 54 string strHeight = Console.ReadLine(); 55 height = Convert.ToDouble(strHeight); 56 } 57 58 // 获得面积 59 public override double CountArea() 60 { 61 return width * height; 62 } 63 64 // 获得周长 65 public override double CountLength() 66 { 67 return 2 * (width + height); 68 } 69 } 70 71 //形状计算器:ShapeCol 72 public class ShapeCol 73 { 74 // 获得形状面积 75 public double GetArea(Shape shape) 76 { 77 return shape.CountArea(); 78 } 79 80 // 获得形状周长 81 public double GetLength(Shape shape) 82 { 83 return shape.CountLength(); 84 } 85 } 86 87 class Program 88 { 89 static void Main(string[] args) 90 { 91 ShapeCol shapecol = new ShapeCol(); 92 Shape shape = null; 93 Console.WriteLine("控制台:请输入您要计算的形状: 1-圆形, 2-矩形"); 94 95 string strType = Console.ReadLine(); 96 if (strType == "1") 97 { 98 Console.WriteLine("控制台:确认为1-圆形"); 99 shape = new Circle(); 100 } 101 else if (strType == "2") 102 { 103 Console.WriteLine("控制台:确认为2-矩形"); 104 shape = new Square(); 105 } 106 107 //根据类型接收用户输入的形状参数 108 shape.SetR(); 109 Console.WriteLine("控制台:圆形的面积为 {0} 周长为 {1}", 110 shapecol.GetArea(shape), shapecol.GetLength(shape)); 111 } 112 }