Sınıfın başka bir sınıf içinde bir işlev çağrısı

3 Cevap php

Ben gibi bir sınıf vardır:

<?PHP

abstract class dbCon
{
    public function OpenConnection()
    {
          // Do Something;
          // On error:
          $this->ShowError();
    }
    abstract function ShowError();
}

class ErrorHandling extends dbCon
{
    public function ShowError()
    {
        // Show error
    }
}
?>

Yukarıdaki kodda bir kusur vardır. Ben soyut sınıf içinde ShowError () çağırmak istiyorum ama arayüz tanımlanmış nerede olduğunu. Bu başa nasıl?

3 Cevap

Sen heyeti ile mirası karıştırıyorsun. Hataİşleyici gerçekten dbCon bir temsilci olmalıdır.

A sınıfı bir B bir alt sınıfı olmalıdır eğer belirleyen bir kullanışlı bir yoldur diyerek kendinize sormak için "bir B daha bir şey daha spesifik bir tür." Yani, yaptığı A B Bu doğrudur ve aynı zamanda değil nerede bir örnek at least, tüm temel nitelikleri ve davranışları var:

  1. DOĞRU: kedi bir puma is a türü.

  2. YANLIŞ: arabanın bagajına is a türü.

  3. YANLIŞ: plak, yürütmenin bir avukat is a türü.

2. durumda, bir kamyon part bir araç olduğunu, bu nedenle bu model doğru yolu kompozisyon gereğidir; sonra Trunk nesnesine bir başvuru içeren bir Araç nesnesi var.

3 durumunda, bir avukat, bir delegate plak yürütmenin olup; Bu modellemek için doğru yolu RLExective nesne bilen bir veya daha fazla Avukatlar bir başvuru tutun ve ihtiyaç duyulduğunda RLExecutive Avukatlar herhangi birinde SueCollegeStudentOrGrandmother () yöntemini çağırmak zorunda olması gereğidir.

Burada hiyerarşi, sen diyorsun ki dbCon arasında Hataİşleyici is a türü. Bu hiç mantıklı değil. Bu Hataİşleyici kullanım hataları ile görevli dbCon bir delegate, olduğunu söylemek daha doğru olacaktır. Bu durumda, muhtemelen bir freefloating Hataİşleyici nesne, ya da belki DB hataları hakkında spesifik bilgi ile bir isterim. DbCon onu görüntülemek isteyen bir hata alır zaman, bu ShowError () yöntemiyle Hataİşleyici üzerinde hata atar.

Yorumlarınız dayanarak, bu karışıklık extends anlamında yatıyor görünüyor. Hataİşleyici extends dbCon derken, siz Hataİşleyici dbCon ek işlevsellik ekler değil, Hataİşleyici dbCon bir alt sınıfı olduğunu söyledi. Bu dbCon and Hataİşleyici işlevselliği hem olurdu Hataİşleyici bir örneğini oluşturmak zorunda kalacak anlamına gelir. Bu ne istediğinizi muhtemelen değildir.

Bu anlamda yapılan umuyoruz.

Sen uygulamak olabilir kendi exception handler:

class Exception_Handler extends Exception {
    ...
}

class DB_Connection {
    try {
        throw new Exception_Handler('Cannot connect to DB: ' . $exception->getMessage() . '.');
    } catch (Exception_Handler $exception) { $exception->show(); }
}

Daha bu konuda: http://www.w3schools.com/php/php_exception.asp

Ben hakkında okumanızı öneririm Polymorphism.

Ana sınıfından ShowError() çağırma örneği sınıf tarafından belirlenecek ve bu çalışma yapılır.

Göstermek için, bu kodu göz önünde bulundurun:

<?PHP

abstract class dbCon {
    public function OpenConnection() {
          // Do Something;
          // On error:
          $this->ShowError();
    }
    abstract function ShowError();
}

class ErrorHandling extends dbCon {
    public function ShowError() {
        // Show error
        echo "Error is here\n";
    }
}
class WarningHandling extends dbCon {
    public function ShowError() {
        // Show waring
        echo "Warning is here\n";
    }
}

$ErrorHandling = new ErrorHandling();
$ErrorHandling->OpenConnection();

$WarningHandling = new WarningHandling();
$WarningHandling->OpenConnection();

?>

Çalıştırdığınızda, alırsınız:

Error is here
Warning is here

Neden?

Ilk ShowError() ErrorHandling tipi bir nesne değil, çünkü. PHP nesne somut ErrorHandling adlı bu nedenle zaman ShowError() denir görür OpenConnection, php nesne türü ({[(1 işlevini kullanın )]}).

İkinci ShowError() çağrı bir nesneden bir WarningHandling böylece PHP ShowError() WarningHandling içinde kullanıyor.

Polymorphism dikkatli bir göz atın. (Bu Nesne temelli yönelimli eksik tek olarak) Polimorfizm OOP en önemli kavramlardan biri olduğunu.

Umarım bu yardımcı olur.