将任何类或任何方法声明为“final”的示例场景是什么?

时间:2010-04-23 05:07:51

标签: php oop class methods final

将任何类或任何方法声明为“final”的示例场景是什么?我们什么时候需要这样做?

请举一些例子来了解“最终”的实际用途......

请详细说明你的答案......

请指导我,因为我是OOP的初学者

4 个答案:

答案 0 :(得分:5)

这只是一个例子,详细说明为什么必须从任何进一步的扩展中锁定方法/类以避免意外。

class Account {
    public function debit(Amount $amount) {
        if(($this->canDebit($amount)) {
            $this->balance -= $amount;
        }
    }

    final public function credit(Amount $amount) {
        ...
    }
}

class CheckingAccount extends Account {
    public function debit(Amount $amount) {
        // we forgot to check if user canDebit()
        $this->balance -= $amount;
    }
}

这只是一个例子来说明为什么必须使方法和类最终。事实上,将所有方法和类最终作为一个非常好的做法,除非你知道你将扩展它们,并且子类可能希望(并且将被允许)扩展/覆盖基类。

答案 1 :(得分:2)

基本上,如果您认为任何课程不应该被延期,或者您或其他任何人不需要扩展该课程,您就会宣布任何课程。

答案 2 :(得分:1)

设计类的目的是扩展或无意扩展。如果您的班级无意成为家长,则应将其列为最终。旨在扩展的课程有责任奠定孩子将从中工作的框架。任何定义框架规则的方法都应说明为最终方法。

这个描述与问题一样模糊。

我喜欢Anurag的会计示例,我希望展示正确的用法。

abstract class Account {

    // obtained by some magical source
    private $balance = 100.00;

    final public function getBalance() {
        return $this->balance;
    }

    final private function setBalance($new_balance) {
        $this->balance = $new_balance;
    }

    final public function debit(Amount $amount) {
        if ($this->canDebit($amount)) {
            $amount = $amount + $this->getDebitTransactionFee();
            $this->setBalance($this->getBalance() - $amount);
        }
    }

    abstract protected function canDebit();
    abstract protected function getDebitTransactionFee();

}

final class CheckingAccount extends Account {

    final protected function canDebit() {
        return true;
    }

    final protected function getDebitTransactionFee() {
        // obtained by some magical source
        return 1.50;
    }

}

账户的责任是跟踪余额,允许公众借记,并允许公众检查当前余额。 CheckingAccount的责任是回答是否可以借记并报告相应的交易费用。显然,这里的会计极其简化。这个例子可能是无限的情况之一。

抽象类对于要扩展的类非常常见。但是,有时候,类可以使用默认函数定义自己的非final方法,并具有操作实例。当然,作为非final,这些默认方法可以自由地被子类覆盖。

答案 3 :(得分:0)

仅限静态类,您可以

final private function __construct()
{
// This is a static class
}

Kohana does it一样。

你也可以决定这个类(扩展另一个)是你想要的最后一个。使用final关键字会向未来的开发者暗示您的意图。

因此,如果他们尝试扩展它,他们就会收到错误并知道为什么他们不能。