是否可以使用final静态类方法


Is a final static class method possible?

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

你误解了final的意思。

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

这样做的原因有点棘手,但一旦你掌握了,你就会意识到这是有道理的。也就是说,如果一段代码能够处理特定类的项,那么它也必须能够处理该项的任何子类。如果一个子类没有其父类的所有功能,你就不能那样做。

例如,假设您有一个定义了与支付网关接口的类。由于所有的支付网关都是不同的,您不能(或者至少不应该)实现一个可以与任何可用的支付网关接口的类。但总的来说,支付网关的工作原理是一样的。发送请求,包括用户的信用卡详细信息和要从该卡中扣除的金额。支付网关响应一条消息,说明支付是否被授权。

你要用一个抽象的超类来实现这种功能,这个超类定义了你如何与支付网关进行接口,然后你要为你想要使用的每个支付网关(paypal, sagepay,等等)创建一个子类。

由于所有这些子类都继承自同一个基类,因此可以确定它们都实现了特定的方法,并且可以放心地向这些方法发送消息。只要你处理的支付类是抽象支付类的子类,那么一切都应该正常工作。

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

Final在PHP(以及大多数实现它或类似概念的OOP语言)中表示"这是此方法的最终实现"。如果一个程序员子类化了我,那么他就不能用他自己的实现代替我的最终方法"。这并不意味着这些方法在子类中不可用,只是你不能改变它们。

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

一般来说,如果你遇到在超类中拥有子类中不需要的功能的情况,这是一种代码气味,它告诉你可能需要重新考虑你的设计。

Static是指每个类一个实例,而不是每个对象一个实例,无论一个类可能存在多少个实例。这意味着您可以在不创建类实例的情况下使用它们。静态方法是隐式final的,因为重写是根据对象的类型完成的,并且静态方法附加到类,而不是对象。超类中的静态方法可以被子类中的另一个静态方法掩盖,只要原始方法没有声明为final。但是,您不能用非静态方法覆盖静态方法。换句话说,你不能将静态方法更改为子类中的实例方法。

final类不能扩展为ie。, final类不能被子类化。当final方法的类被继承时,它不能被重写。你不能改变final变量的值(是一个常量)。

你做错了。

您希望扩展类而不是具有方法,这意味着您违反了Liskov替换原则。如果阅读困难:这里是一个图片解释它。

如果你有一种情况,当你在释放到应用程序之前必须对对象执行某种"工作"时,那么你应该为它使用Factory/Builder。

class FooBuilder
{
   public function create( $external_condition )
   {
      $object = new Foo;
      if ( $external_condition->has_happened() )
      {
         $object->set_condition( $external_condition );
      }else{
         $object->do_something_else();
      }
      return $object;
   }
}

现在您总是通过FooBuilder创建Foo类的实例,并且当您扩展Foo时,它没有任何无用的方法。

另外,我认为类中的静态方法是过程编程的标志。静态变量只不过是封装在命名空间中的全局变量,伪装成类。

在POO中,如果一个类B继承了另一个类a,那么这个类B将包含来自类a的所有方法,这是POO继承的基础。所以I don't want that method to be inherited in the derived class在这里没有意义。你应该考虑另一种机制。

同样,在most的情况下,这种情况(您不希望派生类继承方法)表明您的派生类根本不应该继承,并且您应该使用另一个系统。

检查这个例子:

<>之前类foo{Private static $stuff = array('key1' => 1, 'key2' => 2);公共最终静态函数getstuff(){返回self:: $的东西;}}

我同意PHP中OOP的pomeh,我还想添加FINAL关键字在与方法一起使用时实际上意味着该方法不能被覆盖。该方法将被继承。