Ne "son" olarak herhangi bir sınıf veya herhangi bir yöntem bildirmek için örnek senaryolar olabilir mi?

4 Cevap php

Ne "son" olarak herhangi bir sınıf veya herhangi bir yöntem bildirmek için örnek senaryolar olabilir mi? Ne zaman biz bunu yapmak gerekiyor?

"Final" pratik kullanımını anlamak için bana bazı örnek verin ...

Cevabınızı ayrıntılı lütfen ....

Ben OOP'deki bir acemi olarak kılavuz beni lütfen

4 Cevap

Bu yöntemleri / sınıfları sürprizlerden kaçınmak için başka uzantıları bazen aşağı kilitli olması gerekir neden ayrıntılı sadece bir örnektir.

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

Bu yöntemleri ve sınıfları nihai hale getirmek için gerekli neden göstermek için sadece bir örnektir. Aslında, son unless Eğer onları genişletmek için gidiyoruz biliyorum, ve alt sınıfları isteyebilirsiniz (ve izin verilecektir) uzatmak için / tabanını geçersiz tüm yöntem ve sınıfları yapmak için çok iyi bir uygulamadır sınıf.

Eğer herhangi bir daha fazla uzatılmaması gereken veya sınıfını genişletmek için siz ya da başkası da gerek olduğunu düşünüyorum zaman temelde herhangi bir sınıf nihai beyan.

Sınıflar genişletilmiş olma niyetiyle veya genişletilmiş olma niyeti olmadan tasarlanmıştır. Sınıf bir ebeveyn olmanın bir niyeti varsa, bu kesin olarak belirtilmelidir. Uzatılabilir tasarlanmış bir sınıf çocuğun çalışmak olacaktır hangi çerçeve hazırlamak için sorumluluğu vardır. Çerçevenin kuralları tanımlamak Herhangi yöntemler nihai olarak belirtilmelidir.

Bu açıklama soru gibi muğlak.

Ben Anurag gelen muhasebe örneği gibi ve ben nasıl doğru kullanımını göstermek istiyoruz.

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

}

Hesap sorumluluk, denge takip kamu borç izin ve kamu cari denge kontrol sağlamaktır. CheckingAccount sorumluluğu da tahsil edilebilir eğer cevaplamak ve ilgili işlem ücreti rapor etmektir. Açıkçası burada muhasebe son derece kolaylaştırılmıştır. Bu örnek, büyük olasılıkla sonsuz durumlardan biridir.

Soyut sınıflar genişletilmesi gerekiyordu sınıfları için oldukça yaygındır. Ancak bazen, bir sınıfı varsayılan fonksiyonu ile kendi olmayan final yöntemlerini tanımlamak ve operasyonel bir örneği olabilir. Tabii, sigara final olmak, bu varsayılan yöntemler daha sonra bir çocuk sınıf tarafından geçersiz kılınabilir için ücretsizdir.

Sadece statik bir sınıf için, yapabileceğin

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

Gibi nasıl Kohana does it.

Ayrıca, (başka bir genişletilmiş) Bu sınıf Dilerseniz son olduğuna karar verebilir. final anahtar kelimeyi kullanarak gelecekteki geliştiriciler için niyetinizi ipucu olacaktır.

Onlar denemek ve bunu genişletmek Yani, onlar bir hata alırsınız ve why başaramadılar biliyorum.