将任何类或任何方法声明为“final”的示例场景是什么?我们什么时候需要这样做?
请举一些例子来了解“最终”的实际用途......
请详细说明你的答案......
请指导我,因为我是OOP的初学者
答案 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
关键字会向未来的开发者暗示您的意图。
因此,如果他们尝试扩展它,他们就会收到错误并知道为什么他们不能。