抽象类

抽象类

抽象

在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是反过来却不是这样。并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类。抽象类往往用来表征我们在对问题领域进行分析、设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象。

例如:有关几何体体积的计算,把几何形状定义为类,把体积定义为方法,显然方法是不可能实现的,只有一个具体的几何体才可以计算具体体积,球体,立方体等;

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.有一个抽象方法----影响了出了一个抽象类,都是静态的方法----出了静态类,所以抽象

类可有普通方法,而静态类没有普通方法