抽象类
抽象方法是没有代码实现的方法,使用abstract关键字修饰;
- 抽象类是包含0到多个抽象方法的类,其不能实例化。含有抽象方法的类必须是抽象类,抽象类中也可以包含非抽象方法;
- 重写抽象类的方法用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)的区别
- 虚方法必须要有方法体,抽象方法不允许有方法体;
- 虚方法可以被子类(派生类)重载(override),抽象方法必须被子类重载;
- 虚方法除了在密封类中都可以写,抽象方法只能在抽象类中写。
接口
接口是一套规范,遵守这个规范就可以实现功能。
- 接口中只定义方法的原型,不能有字段和常量;
- 继承接口的类必须实现接口中所有的方法才能实例化
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);
接口作为返回值使用:接口作为返回值返回了一个实现接口的对象
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();