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)

posted @ 2021-07-09 17:49  狼王爷  阅读(39)  评论(0编辑  收藏  举报