抽象方法只能够存在于抽象类中,
抽象方法只能够有声明的部分,而不能够有实现部分,例如:public abstract void a();//以";"代替"{...}"
抽象方法是默认为virtual的,所以你在声明一个抽象方法时不能够再使用virtual关键字
抽象类如果得不到继承,几乎没有什么意义,而在你继承了一个抽象类以后,对于里面的每一个抽象成员你都必须override之,至于为什么要这样,很容易理解,抽象方法仅仅有一个声明的部分,没有任何实现的代码,不override,它又有什么意义呢?
抽象类中不止可以有抽象的方法,还可以有其他类型的方法(就是非抽象的方法,非抽象的方法可以包含内容的代码)
抽象类可以继承自其他的类,同样,也可以继承自另一个抽象类

有一个共同点:抽象类和接口都不能够被建立内存实体,都必须先得到继承,然后再建立继承的那个类的实体(像Image,你就无法直接建立它的实体,因为它是一个抽象类,而Bitmap是继承自Image,你可以直接建立Bitmap的实体)

接口里面所有的内容都只能有声明的部分,不能够有实现的代码,这一点跟抽象类中的抽象方法很像,
接口里声明的所有成员都必须是public的,但是事实上,接口中的每个成员也都是默认为public的,所以你在声明它的时候不能再加一个public
接口能够继承自其他的接口
你在使用接口的时候,对接口中定义的每一个方法都必须完整地实现之,而且在实现它们的时候,你不需要使用override关键字

 1 
 2 abstract class B//声明了一个抽象类 
 3 
 4 public int I = 0;//这里声明了一个普通的变量 
 5 public abstract void Do();//这里声明了一个抽象方法,注意这里是如何声明的 
 6 public abstract void Do(int i); 
 7 public void Do2()//这里声明了一个普通的方法 
 8 
 9 Console.WriteLine("Do2"); 
10 
11 
12 class A:B//因为A继承自B,所以对于B中的所有public成员,A都有 
13 
14  public override void Do()     //对于每一个abstract的方法都必须override 
15  { 
16   Console.WriteLine("new Do1"); 
17  } 
18  public override void Do(int i)//对于每一个abstract的方法都必须override 
19  { 
20   Console.WriteLine("new Do2 "+i.ToString()); 
21  } 
22 
23 public class C 
24 
25  public static void Main()//Main必须为静态方法 
26  { 
27   A a = new A(); 
28   a.Do();//输出"new Do1"  
29   a.Do(123);//输出"new Do2 123" 
30   a.Do2();//输出"Do2" 
31  } 
32 
33 
34 
35 
36 
37 
38 public interface I1 
39 
40  void Say();//记住,这个地方不能够使用其他的修饰符 
41  public void Says();//错误,使用了public修饰符,因为Interface中的成员都是默认为public的 
42 
43 public class AA:I1 
44 
45  public void Say()//因为I1这个接口定义了一个void的Say方法,所以在这里必须予以实现 
46  { 
47   Console.WriteLine("Say AA!"); 
48  } 
49