4

クラスまたはメソッドを「最終」として宣言するシナリオの例は何ですか? いつこれを行う必要がありますか?

「最終」の実用的な使い方を理解するための例を教えてください...

あなたの答えを詳しく教えてください....

私は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 にする必要がある理由を説明するための単なる例です。実際、すべてのメソッドとクラスを final にすることは非常に良い方法です。ただし、それらを拡張するつもりであり、サブクラスが基本クラスを拡張/オーバーライドする必要がある (そして許可される) 場合を除きます。

于 2010-04-23T05:26:24.983 に答える
2

基本的に、クラスをこれ以上拡張する必要がないと思われる場合、または自分または他の誰かがそのクラスを拡張する必要がないと判断した場合は、クラスを final として宣言します。

于 2010-04-23T05:12:00.073 に答える
1

クラスは、拡張することを意図して、または拡張することを意図せずに設計されています。あなたのクラスが親になる意図がない場合は、それを最終的なものとして宣言する必要があります。拡張するように設計されたクラスには、子供が作業するフレームワークを構築する責任があります。フレームワークのルールを定義するすべてのメソッドは、final として宣言する必要があります。

この説明は、質問と同じくらいあいまいです。

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 の責任は、引き落としが可能かどうかを回答し、それぞれの取引手数料を報告することです。明らかに、ここでの会計は非常に単純化されています。この例は、おそらく無限の状況の 1 つです。

抽象クラスは、拡張することを意図したクラスでは非常に一般的です。ただし、場合によっては、クラスがデフォルト関数を使用して独自の非最終メソッドを定義し、操作可能なインスタンスを持つことができます。もちろん、最終的なものではないため、これらのデフォルト メソッドは子クラスによって自由にオーバーライドされます。

于 2010-04-23T08:02:00.437 に答える
0

静的クラスの場合のみ、次のことができます

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

コハナのやり方のように。

このクラス (別のクラスを拡張したもの) を最後にすることもできます。finalキーワードを使用すると、将来の開発者にあなたの意図を示すことができます。

したがって、拡張しようとすると、エラーが発生し、拡張できない理由がわかります。

于 2010-04-23T05:11:22.530 に答える