最终的静态类方法是否可行?

Tir*_*ala 2 php inheritance static class

我需要一个类来继承另一个类.我_init()在基类中有一个静态函数,我不希望在派生类中继承该方法.我尝试了final关键字,但它不起作用.我该怎么办?

Gor*_*onM 7

你误解了最后的意思.

OOP的基本原则之一是,如果一个类是另一个类的子类,那么该类将获得它继承的类的所有功能.你不能只继承一些超类功能,它是全有或全无.

这样做的原因有点难以掌握,但一旦你这样做,你就会意识到这是有道理的.也就是说,如果一段代码能够处理特定类的项,那么它也必须能够处理该项的任何子类.如果子类没有其超类的所有功能,则无法执行此操作.

例如,假设您有一个定义与支付网关接口的类.由于所有支付网关都不同,您无法(或至少不应该)实施可与任何可用支付网关连接的单个类.但总的来说,支付网关以相同的基本方式工作.发送请求,包括用户的信用卡详细信息以及您要从卡中扣款的金额.支付网关响应一条消息,说明支付是否被授权.

您可以使用抽象超类来实现这种功能,该超类定义了您通常如何与支付网关接口,然后为您想要使用的每个支付网关创建一个子类(paypal,sagepay,等等).

由于所有这些子类都继承自相同的基类,因此您可以确定它们都实现了某些方法,并且您可以毫无顾虑地向这些方法发送消息.只要您正在处理的支付类是您的抽象支付类的子类,那么一切都应该有效.

如果其中一个子类无法从抽象超类实现某些东西,那么您无法确定向子类发送特定消息是否有效,或者抛出异常.这会使继承变得毫无意义.

PHP中的最终版本(实际上是大多数实现它或类似概念的OOP语言)意味着"这是此方法的最终实现.如果程序员将我子类化,那么他就不能用自己的实现替换我的最终方法".这并不意味着这些方法在子类中不可用,只是你无法改变它们.

如果你真的必须从子类中删除功能,你可以通过重写超类方法并用一个空方法(一个什么都不做)替换它来实现.但不要这样做,因为它会导致上述类型的问题.

通常情况下,如果您遇到在超类中具有子类中不需要的功能的情况,那么代码味道会告诉您可能需要重新考虑您的设计.