抽象和接口
抽象类和抽象方法
抽象方法:1 带抽象方法的类必须是抽象类,若不是要在类加abstract修饰符
2 描述抽象方法时必须只是一个方法体,无需后面的大括号及内容
3 抽象方法必须在子类中重写
4 静态方法和抽象方法不能是一个方法
抽象类: 1 抽象类不能被实例化
2 抽象类和最终类不能使同一个类,因为抽象类本身不能实例化,必须被继承才有意义
3 抽象类的非抽象子类必须包含抽象类的所有方法和成员,其中抽象方法需要重载
1 //抽象类 2 public abstract class Abstract_test 3 { //计算面积 4 public abstract double Area(); //抽象方法 6 } 7 8 public class Circle : Abstract_test 9 { 10 private double pi = 3.14; 12 public double r = 0;
13 public Circle(){} 18 public Circle(double r){this.r = r;}22 23 public override double Area() //继承抽象方法时必须重载 24 { 26 return this.pi * this.r * this.r; 27 }
若父类中已重写过部分的抽象方法,子类只需重写未重写的方法(也可全部重载)
1 public abstract class Abstract 2 { 3 public abstract void test1(); 4 public abstract void test2(); 6 } 7 8 public abstract class Test1:Abstract 9 { 10 public override void test1() 11 { 12 Console.WriteLine("test1"); 13 } 14 } 15 16 public class Test2:Test1 17 { 18 public override void test2() 19 { 20 Console.WriteLine("test2"); 22 } 23 }
接口
规则:
1 接口可定义方法,带参数属性,事件,不能定义字段,静态变量等
2 接口成员不能有修饰符
3 接口可以被多个类继承,一个类也可以继承多个接口
4 接口不能随便修改
5 可用new隐藏从基接口继承的成员
1 public interface IClass1 //interface为接口 2 { 3 void test1(); 5 void test2(); 7 } 8 9 public interface IClass2 11 { //接口中只能定义以下三种类型 12 string testString { get; set; } //属性 14 void test3(); //方法 16 event EventHandler testEvent; //事件 17 } 18 19 public interface IClass3 : IClass1 //接口的继承,子接口中自动继承了父接口所有的方法 20 { 21 void test5(); 23 } 24 26 public class Class3 : IClass2, IClass3 //接口可多继承,必须把继承接口中的方法属性补全 27 { 28 string IClass2.testString { get ; set ; } 30 event EventHandler IClass2.testEvent 31 { 32 add => throw new NotImplementedException(); 37 remove => throw new Not ImplementedException();41 } 43 void IClass1.test1() 44 { 45 throw new NotImplementedException(); 46 } 48 void IClass1.test2() 49 { 50 throw new NotImplementedException(); 51 } 53 void IClass2.test3() 54 { 55 throw new NotImplementedException(); 56 } 58 void IClass3.test5() 59 { 60 throw new NotImplementedException(); 61 } 62 }
接口和抽象类都可作为类型声明变量,并利用多态性进行筛选操作
接口和抽象的区别
1 修饰符不同
2 抽象类是类,类只能被类单继承;而接口可以被多继承
3 接口只能定义属性方法和事件;而抽象可以定义几乎所有
4 抽象类中可以有非抽象方法,即普通方法;而接口中只能有签名
5 接口不能使用访问修饰符,隐式为公共;抽象成员不可以抽象的,但可以是私有、保护、内部或者受保护的内部成员