抽象类
抽象
在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。
例如:有关几何体体积的计算,把几何形状定义为类,把体积定义为方法,显然方法是不可能实现的,只有一个具体的几何体才可以计算具体体积,球体,立方体等;
public abstract class Shape
{
public string name; // 希望其他类可以访问物体的名字
protected double radius; //不希望可以访问半径
public Shape (double radius,string name){
this.radius = radius;
this.name = name;
}
public abstract double Cubage (); // 用来计算体积的方法 Cubage--容积
public abstract double SurfaceArea();
}
public class Globe: Shape
{
public Globe (double radius, string name) : base (radius, name)
{
}
public override double Cubage(){
return 3.14 * radius * radius * radius * 4.0 / 3;
}
public override double SurfaceArea()
{
return 4 * 3.14 * radius * radius;
}
}
public class Cylinder :Shape
{
private double high;
//-----
public Cylinder (double radius,double high,string name) : base (radius,name)
{
this.high = high;
}
public override double Cubage(){
return 3.14 * radius * radius * high;
}
public override double SurfaceArea()
{
return 2 * 3.14 * 3.14 + 2 * 3.14 * high;
}
}
//可以求物体体积,表面积,等几何参数类 Geometric 几何
public static class GeometricParameter
{
public static string GetCubag(Shape p)
{
//is运算符可以检查对象是否与特定的类型兼容。
if(p is Cylinder) {
p.name = p.name + "Cylinder";
}else if(p is Globe){
p.name = p.name + "Globe";
}else{
}
double f = p.Cubage ();
string n = p.name;
string s = string.Format ("所求物体{1}的几何体积{0}", f,n);
Console.WriteLine ("所求物体{1}的几何体积{0}",f,n);
return s;
}
public static string GetSurfaceArea(Shape p){
double f = p.SurfaceArea();
string n = p.name;
string s = string.Format ("所求物体{1}的几何表面积{0}", f,n);
Console.WriteLine ("所求物体{1}的几何表面积{0}", f,n);
return s;
}
}
class MainClass
{
public static void Main (string[] args)
{
Cylinder A = new Cylinder (1, 2,"1号柱体");
Globe b = new Globe (1, "1号球体");
GeometricParameter.GetCubag (A); //所求物体1号柱体Cylinder的几何体积6.28
GeometricParameter.GetSurfaceArea (A); //所求物体1号柱体Cylinder的几何表面积32.2792
GeometricParameter.GetCubag (b); //所求物体1号球体Globe的几何体积4.18666666666667
GeometricParameter.GetSurfaceArea (b); //所求物体1号球体Globe的几何表面积12.56
}
}
}
抽象类:提供多个派生类可以共享的基类,CUbage 方法,之后所有派生类都必须实现CUbage 求体积的方法,并且保持一致的方法名,这样保证代码的格式统一,规范;
抽象方法和虚方法
1.抽象方法一定不能有实现,虚方法一定要有实现;
2.抽象方法被具体类继承后,一定要被重写,虚方法可以不重写。
3.抽象方法一种特殊的虚方法,一旦类中有抽象方法,则类必须声明为抽象类,抽象类中可以有虚方法。
4.抽象类--子类必须重写;
5. 抽象方法只作声明,而不包含实现,抽象方法旨在继承后实现,所以不能用private修饰(会直接提示错误的,一个必须实现的方法又不让子类实现,这是自相矛盾的)。
private abstract void add(); (错误)
6. 抽象类不能被直接实例化。 shape s = new Shape (错误)
7.如果抽象类的派生类不是抽象类,那么必须重写抽象类的所有抽象方法。类不是抽象类时候放抽象父亲类的方法是必须实现的;
8.重写父亲类的抽象方法和实现实一个意思;
9.有一个抽象方法----影响了出了一个抽象类,都是静态的方法----出了静态类,所以抽象
类可有普通方法,而静态类没有普通方法