4

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

请给我一些例子来理解“final”的实际使用......

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

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

4

4 回答 4

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;
    }
}

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

于 2010-04-23T05:26:24.983 回答
2

基本上,当您认为不应再扩展任何类或您或其他任何人都不需要扩展该类时,您就声明了任何类 final。

于 2010-04-23T05:12:00.073 回答
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;
    }

}

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

对于要扩展的类来说,抽象类是很常见的。然而,有时,一个类可以使用默认函数定义自己的非最终方法并拥有一个可操作的实例。当然,作为非最终方法,这些默认方法可以自由地被子类覆盖。

于 2010-04-23T08:02:00.437 回答
0

仅对于静态类,您可以这样做

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

就像Kohana 是如何做到的一样

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

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

于 2010-04-23T05:11:22.530 回答