抽象类(abstract)和接口(interface)

抽象类


  抽象方法是没有代码实现的方法,使用abstract关键字修饰;

  1. 抽象类是包含0到多个抽象方法的类,其不能实例化。含有抽象方法的类必须是抽象类,抽象类中也可以包含非抽象方法;
  2. 重写抽象类的方法用override关键字。
 1 //定义一个抽象类,包含一个抽象方法,但该方法未实现
 2 abstract class MyAbs{
 3     public abstract void AbMethod();            
 4 }
 5 //定义一个非抽象派生类,只能继承一个类
 6 class MyClass:MyAbs{
 7      public override void AbMethod(){
 8         Console.WriteLine("此MyClass中实现父类中未实现的抽象方法!");
 9      }
10  }
11 //在主程序中实例化一个MyClass对象,并调用AbMethod方法
12 static void Main(string[] args){
13     MyClass objMyClass = new MyClass();
14     objMyClass.AbMethod();
15 }
  • 虚方法(virtual)与抽象方法(abstract)的区别
  1. 虚方法必须要有方法体,抽象方法不允许有方法体;
  2. 虚方法可以被子类(派生类)重载(override),抽象方法必须被子类重载;
  3. 虚方法除了在密封类中都可以写,抽象方法只能在抽象类中写。

接口


  接口是一套规范,遵守这个规范就可以实现功能。

  1. 接口中只定义方法的原型,不能有字段和常量;
  2. 继承接口的类必须实现接口中所有的方法才能实例化
1 //隐式声明为public
2 public interface IPict{
3     //只有方法声明,没有访问修饰符,没有实现
4     int DeleteImage();
5     void DisplayImage();
6 }

  定义派生自接口的类,并实现所有接口中的方法

 1 public class MyImages: IPict{
 2     //第一个方法的实现
 3     public int DeleteImage(){
 4         Console.WriteLine("DeleteImage实现!");
 5     }
 6     
 7     //第二个方法的实现
 8     public void DisplayImage(){
 9         Console.WriteLine("DisplayImage实现!");
10     }
11 }

  在主程序中实例化一个MyImages对象,并调用DeleteImage和DisplayImage方法

1 static void Main(string[] args){
2     MyImages ofjM = new MyImages();
3     objM.DisplayImage();
4     int t = objM.DeleteImage();
5     Console.WriteLine(t);
6 }
  • 多重接口实现

  C#不允许多重类继承,但允许多重接口实现。但如果发生命名冲突就需要使用前缀进行显式接口实现或调用。如果继承接口的类中用显示方法实现接口中的方法时,实现方法不需加访问修饰符(public)

 1 public interface IPict{
 2     void DisplayImage();
 3 }
 4 
 5 public interface IPictManip{
 6     void DisplayImage();
 7 }
 8 
 9 public class MyImages: IPict, IPictManip{
10     void IPict.DisplayImage(){    //如果用显示接口实现方法,则不需使用访问修饰符
11         Console.WriteLine("DisplayImage的IPict实现");
12     }
13     void IPictManip.DisplayImage(){
14         Console.WriteLine("DisplayImage的IPictManip实现");
15     }
16 }
17 
18 static void Main(string[] args){
19     MyImages objM = new MyImages();
20     IPict Pict = objM;    //IPict引用
21     Pict.DisplayImage();
22     IPictManip PictManip = objM;  //IPictManip引用
23     PictManip.DisplayImage();
24 }
  • 使用自定义接口

  接口作为参数使用:接口作为参数传递了实现接口的对象

1 //无论谁收作业参数类型部分都不需做任何改变
2 private void DoCollectHomework(IHomeworkCollector collector){
3     collector.CollectHomework();
4 }
5 
6 DoCollectHomework(scofield);

  接口作为返回值使用:接口作为返回值返回了一个实现接口的对象

扫描二维码关注公众号,回复: 2698862 查看本文章
 1 private IHomeworkColletor CreateHomeworkCollector(string type){
 2     switch(type){
 3         case "student":
 4         collector = new Student("Scofield", Genders.Male, 28, "越狱");
 5         break;
 6     }
 7     //返回一个实现该接口的对象
 8     return collector
 9 }
10 
11 collector.CollectHomework();

猜你喜欢

转载自www.cnblogs.com/goalie/p/9460400.html