1
2
3
4
5
6
  • AR开发
7
8
  • 系统优化与发布

抽象类与接口

发布时间:2021-02-26 22:41   发布人:焦卫峰   浏览次数:304

1.抽象类

抽象类是特殊的类,它不能被实例化,只能作为其它类的基类而存在,其目的是抽象出子类的公共部分以减少代码重复。

抽象方法是一种特殊的虚方法,它只能定义在抽象类中,抽象方法没有任何执行代码,需要在派生类中用重写的方式具体实现(除非派生类依旧是抽象类)。

除了抽象方法外,我们还可以在抽象类中定义抽象属性。抽象属性也没有具体实现代码,必须在派生类中重写。

    abstract class A{
        public abstract void P();
}

一个抽象类的子类还是抽象类,除非子类实现了父类中所有的抽象方法。

 class B:A{
        public  override void P(){
        }
}

 

总结:

抽象类不能产生对象

抽象方法没有方法体

抽象类中不一定包含抽象方法

含有抽象方法的类一定是抽象类

一个抽象类的子类仍旧是抽象类,除非它实现了父类中所有的抽象方法

 

2.密封类

密封类(Sealed class)是一种不能被继承的类,用 sealed 关键字声明。

同样,如果想防止一个方法被派生类重写,可以用 sealed 关键字把它为声明密封方法。

 

3.接口

飞机会飞,鸟会飞,他们都继承了同一个接口“飞”;但是F22属于飞机抽象类,鸽子属于鸟抽象类。

接口是引用类型的,类似于类,和抽象类的相似之处有:不能实例化;包含未实现的方法声明;派生类必须实现未实现的方法。

接口只是一个行为的规范或规定,接口的名称习惯上以字母 I 开头,微软的自定义接口总是后带able字段,证明其是表述一类“我能做……”。接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法。

接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)。

接口中只能包含成员的声明,不能有任何实现代码。接口的成员总是公有的,不需要也不能添加public 等修饰符,也不能声明为虚方法或静态方法。

interface IFlyable{
        //接口的成员总是公有的,不需要也不能添加public 等修饰符
        void Fly();
    }
 
    class Bird:IFlyable{
        //子类中重写的方法其存取权限不能低于父类的
        public void Fly(){
            //只要有{},不是分号,一行代码没有也是实现
        }
    }
 
    class Airplane:IFlyable{
        public void Fly(){
        }
}

好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染。