虚方法 virtual

  • virtual 关键字用于修饰方法、属性、索引器或事件声明,并且允许在派生类中重写这些对象。
  • virtual 和override一般是一起使用的,
  • overfide 用于覆盖父类的虚方法;
  • base关键字,1.调用基类中已被重写的方法 2.指定创建派生类实例时应调用的基类构造函数。

抽象类 abstract

  1. 抽象类不能被实例化;
  2. 只能声明方法,不能实现,只能有他的
  3. 是一个隐式的虚方法
  4. 抽象类里的方法不能是私有的(如果抽象是私有的,那么他的子类访问不了它)
  5. 在抽象方法中使用static和virtual修饰符是错误的
  6. 在静态属性中使用abstract是错误的

抽象类和虚方法的区别

  1. abstract方法只能在抽象类中声明 而virtual则不是
  2. abstract方法必须在派生类中重写,而virtual则不要
  3. abstract不是声明方法实体,而虚方法则可以
  4. 包含abstract方法的类不能被实例化,而包含virtual可以

接口 interface

接口定义了一个可由类和结构实现的协定。接口包含方法、属性、事件和索引器。接口不提供它所定义的成员的实现 ——他仅指实现该接口或结构必须提供的成员。

  1. 接口是抽象类的特例;
  2. 一个接口声明可以声明零个或多个成员。
  3. 接口的成员必须是方法、属性、或索引器
  4. 所有的接口成员都隐式的具有public访问属性
  5. 接口不能包含常量、字段、运算符、实例构造函数、析构函数或类型,也不能包含任何种类的静态成员。
  6. 接口成员声明中包含任何修饰符都属于编译时错误。具体来说,不能使用修饰符abstract、public 、protected、internal、private、virtual、override或static 来声明接口成员。
  7. 所有接口第一个字符是大写的I(CSharp编码规范)

接口与抽象类

  1. 类是对对象的抽象,可以吧抽象类理解为把类当作对象,抽象成的类。接口只有一个行为的规范或规定。
  2. 接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法;
  3. 一个类一次可以实现若干个接口,但只能扩展一个父类
  4. 抽象类实现了oop中的一个原则,把可变的与不用可变的分离。抽象类和接口就是定义为不可变的,而吧可变的由子类去实现。
  5. 好的接口定义应该具有专一功能性,而不是多功能的,负责造成接口污染。如果一个类只是实现了这个接口中的一个功能,而不的不去实现接口中的其它方法,就叫接口污染
  6. 如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中的方法。
  7. 抽象类用于部分实现一个类,在由用户按需求对其进行不同的扩展和完善;接口只是定义一个行为的规范或规定。
  8. 抽象类在组件的所有实现间提供通用的已实现功能;接口创建在大范围全异对象间使用的功能。
  9. 抽象类主要用于关系密切的对象;而接口适合为不相干的类提供通用功能。
  10. 抽象类主要用于设计大的功能单元;而接口用于设计小而简练的功能块。