php中抽象类和接口的概念和区别(二)
By admin
- One minute read - 45 words一个子类如果implements一个接口,就必须实现接口中的所有方法(不管是否需要);如果是继承一个抽象类,只需要实现需要的方法即可,这是抽象类的一个优点
如果一个接口中定义的方法名改变了,那么所有实现此接口的子类显然将无法通过编译,因为它们所实现的方法名已经不存在了,这是接口的一个缺点;而抽象类就不存在这个问题,只是为子类添加了一个新的方法(接口中旧的方法)
看前面两点,似乎抽象类要比接口有着更多的优点,但它却有着一个难以弥补的缺点:就是一个子类只能有一个父类。A extends B . 这样A就拥有了B的所有方法和功能,但当A还想拥有C的功能的时候。就不能通过 A extends C 来实现, 而需要走一些弯路。目前系统架构的趋势就是由针对抽象(借口,抽象类)而不是具体编程,并且将功能尽可能的细分。 这就需要通过实现多个接口的方式来实现,显然,抽象类无法提供这样的功能。从系统重构的角度来说,一个具体类抽象出接口是十分方便的。只需要写一个接口,里面定义具体类的所有方法,然后在为这个具体类implement这个接口就可以了。而抽象类就要复杂的多,比如说 B extends A , C extends B 如果想要为c抽象出一个抽象类D的话,就需要找到它的最顶层A来从头做起,因为无法做到C extends D
——————————- 继承抽象类的时候不需要实现全部方法,但此子类还是abstract的,无法实例化 ——————————- 我的意思也是尽量使用interface,但抽象类也不是说没用,应该是各有各的优点。最好的方法就是写一个接口,然后做一个这个接口的default抽象类实现,根据需要选择实现接口还是继承抽象类,但这样的缺点就是写太多的类 ——————————- 抽象类的优点:B继承A,C也继承A,假设类B、C中继承的fun1这个方法实现代码是一样的,则可以在A中写好代码,BC只要调用父类A的方法既可,不用重新编写代码;而其他BC方法名相同、具体实现不相同的代码,则在A写成抽象的方法。 ——————————- 这句话讲的很好,以此类推,不断的extends出新的抽象类,不断完成新的方法,以供不同的类来继承实现,提高代码的复用性,但缺点是过于死板,针对性强了一些 ——————————- 要想实现接口隔离只能通过接口来实现,这也是abstract的最大缺陷 ——————————- 接口可多继承,地球人都知道,接口里的东东是public的。 ——————————- 整理一下楼主的贴:
一个子类implements一个接口,如果该子类是非abstract类,就必须实现接口中的所有方法(不管是否需要);而如果该子类是abstract类,则可以实现接口的中方法也可以不实现。 一个子类如果是继承一个抽象类,如果该子类是非abstract类,就必须实现基类中的所有抽象方法;而如果该子类是abstract类,则可以实现基类的中抽象方法也可以不实现。 //这两种情况看起来是一样的,只不过,抽象类中可以有非抽象方法,而接口中必须全是抽象方法。
如果一个接口中定义的方法名改变了,那么所有实现此接口的子类显然将无法通过编译,因为接口的那个改名的方法在非抽象子类中没有实现。 抽象类如果修改了一个抽象方法的名称,子类同样编译不过,但若修改的是非抽象方法,编译没有问题。 //两者看起来看是差不多的,只不过修改的方法有抽象和非抽象之别。
关于 抽象类如果修改了一个抽象方法的名称,子类同样编译不过,如果修改的是非抽象方法,编译没有问题,这个不确定性恰恰是抽象类的致命弱点。