c# Abstract、Virtual、Interface、Sealed 笔记
//1、接口和抽象类具有一些显而易见的区别 //①、接口支持多继承,抽象类则不能 //②、接口可以包含方法、属性、索引器、事件的签名,但不能有实现,抽象类则可以 //③、接口在增加新方法后,所有的继承者都必须重构,否则编译不会通过,而抽象类则不需要 //2、这些区别导致两者的应用场景各有不同 //①、如果对象存在多个功能相近且关系紧密的版本,则使用抽象类 //②、如果对象关系不紧密,但是若干功能拥有共同的声明,则使用接口 //③、抽象类适合于提供丰富功能的场合,接口则更倾向于提供单一的一组功能 //从某种角度来看,抽象类比接口更具备代码的重用性,子类无需编写代码即可具备一个共性的行为 //采用抽象基类的另一个好处是,如果为基类增加一个方法,则继承该基类的所有子类自然就会具备这个额外增加的方法 //而接口却不能,如果要为接口增加一个方法,必须修改所有的子类 //所以,接口一旦被设计出来,就应该是不变的 //抽象基类则可以随着版本的升级,增加一些功能 //3、接口是一种行为规范 //4、接口提供供方法规约,不提供方法体 //5、接口不能用关键字修饰 //6、接口里不能有接口和变量 //7、接口里的方法在子类(派生类)中必须全部实现 //8、接口可以实现多重继承 public interface ITest { void mtd0(); } //抽象类是一个不完全的类,是对对象的抽象 public abstract class Test1 : ITest { public void mtd0() { } //抽象方法必须override(重写),抽象方法不能有方法体,抽象方法只能存在于抽象类中 public abstract void mtd1(); public abstract int mtd2(); //虚方法可以但不必重写,且要有方法体,除sealed类(密封类,不允许被继承)都可以存在,不能与static、abstract、private、override修饰符一起使用 public virtual string mtd3(string a) { return a; } } public class Test2 : Test1 { public override void mtd1() { } public override int mtd2() { return 1; } public override string mtd3(string a) { return base.mtd3(a); } }
参考文献:
《编写高质量代码改善C#程序的157个建议》
C#中的Abstract、Virtual、Interface理解 - GavinJune - 博客园 (cnblogs.com)
C#中interface、Virtual、abstract、Override的用法总结 - chuncn - 博客园 (cnblogs.com)