Какие могут быть примеры сценариев для объявления какого-либо класса или любого метода как "final"? - PullRequest
4 голосов
/ 23 апреля 2010

Какие могут быть примеры сценариев для объявления любого класса или любого метода как "final"?Когда нам нужно это сделать?

Пожалуйста, дайте мне пример, чтобы понять практическое использование "финала" ...

Пожалуйста, дайте подробный ответ ....

пожалуйста, ведите меня, как я новичок в ООП

Ответы [ 4 ]

5 голосов
/ 23 апреля 2010

Это всего лишь пример, объясняющий, почему методы / классы должны иногда блокироваться от любых дальнейших расширений, чтобы избежать неожиданностей.

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

Это всего лишь пример, иллюстрирующий, почему необходимо сделать методы и классы окончательными. Фактически, это очень хорошая практика, чтобы сделать все ваши методы и классы окончательными , если вы не знаете, что собираетесь их расширять, и подклассы могут захотеть (и будут допущены) расширить / переопределить базу класс.

2 голосов
/ 23 апреля 2010

По сути, вы объявляете любой класс финальным, когда считаете, что его больше не следует расширять или нет необходимости ни вам, ни кому-либо еще расширять этот класс.

1 голос
/ 23 апреля 2010

Классы разрабатываются с целью расширения или без намерения расширения. Если ваш класс не намерен быть родителем, его следует указать как окончательный. Класс, предназначенный для расширения, обязан заложить основу, из которой ребенок будет работать. Любые методы, определяющие правила фреймворка, должны быть указаны как 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 состоит в том, чтобы ответить, если он может быть списан, и сообщить о соответствующей комиссии за транзакцию. Очевидно, что учет здесь чрезвычайно упрощен. Этот пример - одна из наиболее вероятных бесконечных ситуаций.

Абстрактные классы довольно распространены для классов, предназначенных для расширения. Иногда, однако, класс может определять свои собственные неконечные методы с функцией по умолчанию и иметь рабочий экземпляр. Конечно, будучи не финальными, эти методы по умолчанию могут быть переопределены дочерним классом.

0 голосов
/ 23 апреля 2010

Только для статического класса вы можете сделать

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

Например, как Кохана делает это .

Вы также можете решить, что этот класс (который расширил другой) - последний, который вам нужен. Использование ключевого слова final подскажет будущим разработчикам ваше намерение.

Поэтому, если они попытаются расширить его, они получат ошибку и узнают , почему они не смогли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...