抽象类

抽象类是指不能被实例化的类,是派生类的基础,通过部分实面或不实现.抽象类可作为其它类的模板.
声明抽象类的语法如下:
abstract    class    类名
{    .....
}

1.抽象方法是隐式的虚方法.
2.只允许在抽象类中声明抽象方法
3.抽象方法声明不提供实际的实现,没有方法体,方法声明以一个分号结束,并在声明后没有大括号.

4.抽象类不能是密封的或静态的
例如:
 public abstract void Sample( );
如果在抽象类中声明了抽象方法,则该抽象类的派生类必须实现基类的抽象方法,否则该派生类不能被实例化.派生类中可以以使用override 修饰符来实现基类中的抽象方法.

 

     abstract class AbstractSample 
        {
            
public abstract void Sample();
        }

        
abstract  class SampleAbstract:AbstractSample 
        {
            
//public override void Sample()
            
//{
            
//    throw new NotImplementedException();
            
//}
        }

        
class MoreSampleAbstract:SampleAbstract 
        {
            
public override void Sample()
            {
                
throw new NotImplementedException();
            }
        }

 

虚函数

虚函数即用virtual来修饰方法,属性,索引器,方法声明,允许派生类对这些被修饰的对象重写。
虚方法的语法:
[   访问修饰符    ]     virtual   [  返回类型 ]   方法名称 ( [  参数列表 ] )

 例如:这个方法可以被任何派生类进行重写
 public virtual void AreaSize(int a,int b){ return a*b;}

 

public class AreaSize 
        {
            
public const double PI = Math.PI;
            
protected double x, y;
            
public AreaSize() 
            { 
            }
           
            
public AreaSize(double _x,double _y) 
            {
                
this.x = _x;
                
this.y = _y;
            }
            
//计算面积
            public virtual double Area() 
            {
                
return x * y;
            }
        }

        
//长方形
        public class rectangle : AreaSize 
        {
            
public rectangle(double _x, double _y):base(_x,_y)
            {             
            }

            
public override double Area()
            {
                
return base.Area();
            }
        }
        
//正方形
        public class Square : AreaSize 
        {
            
public Square(double w) : base(w,0) { }
            
public override double Area()
            {
                
return Math.Pow(x, 2);
            }
        }
        
//圆形
        public class circle : AreaSize 
        {
            
public circle(double r) : base(r, 0) { }
            
public override double Area()
            {
                
return PI * Math.Pow(x, 2);
            }
        }

      
static void Main(string[] args)
        {

            rectangle rt 
= new rectangle(34);
            AreaSize sq 
= new Square(5);
            AreaSize cr 
= new circle(5);

            Console.WriteLine(
"长方形的面积:{0}", rt.Area());
            Console.WriteLine(
"正方形的面积:{0}", sq.Area());
            Console.WriteLine(
"圆形形的面积:{0}", cr.Area());
       }

 

 静态和非静态成员

 非静态成员类的非静态成员属于类的实例,所以每创建一个类的实例都在内存中为非静态成员开辟了一块区域

 类的静态成员属于类所有,为这个类的所有实例所共享。无论这个类创建了多少个副本一个静态成员在内存中只占有一块区域。

类的静态成员每个类只有一个,并为该类的所有实例共享,非静态成员每个实例化的对象都会有一个

 public class StaticSample
        {
            
//静态变量
            public static int a=12;
            
//非静态变量
            public int c=0,d=0;
        }
static void Main(string[] args)
        {
            
//静态的变量直接被类调用
            int a = StaticSample.a;
            
//非静态的变量只能被类的实例化对象调用
            StaticSample ss = new StaticSample();
            
int b = ss.c + ss.d;            
            
//b= ss.a;错误,这样是不能被调用的
        }

 

const 和 static readonly

 const
用 const 修饰符声明的成员叫常量,是在编译期初始化并嵌入到客户端程序.

常量是静态的,不允许在常量声明中包含修饰符 static。
static readonly
用 static readonly 修饰符声明的成员依然是变量,只不过具有和常量类似的使用方法:通过类进行访问、初始化后不可以修改。但与常量不同的是这种变量是在运行期初始化

 

new

new 运算符 用于创建对象和调用构造函数。

new 修饰符 用于隐藏基类成员的继承成员。
new 约束 用于在泛型声明中约束可能用作类型参数的参数的类型。

 

 

 

posted on 2011-06-08 17:42  〤‵坠落者...  阅读(329)  评论(0编辑  收藏  举报