Nasıl dinamik olarak bir ebeveynin yönteminden bir nesnenin sınıfını değiştirebilir?

3 Cevap php

I have a class called Report. I have several classes that inherit from report, ClientReport, ClientVisitReport...

class Report {
    ...
    public function load($id) {
        ...
    }
}

class ClientReport extends Report {
    ...
    public function load($id) {
       parent::load($id);
       ...
    }
}

class ClientVisitReport extends Report {
    ...
    public function load($id) {
        parent::load($id);
        ...
    }
}

Ben yük yöntemine vermek id gelen uygun kurucusunu çağırmak için mümkün olmak istiyorum. Her id raporun kendi sınıfı vardır.

Temelde ben bunu nasıl soruyorum:

$reportObject = new Report(); // reportObject is a Report
$reportObject->load(15678); // report 15678 is a ClientReport, $reportObject is now a ClientReport

Bunu nasıl yapabilirim? Benim tasarım yanlış olabilir, ne istediğinizi yapmak için daha iyi bir yolu var mı?

3 Cevap

Sen AbstractFactory pattern içine bakmak isteyebilirsiniz. Onun amaçlarından biri olduğunu

Somut sınıfları belirtmeden ilişkili ya da bağımlı nesnelerin aileleri oluşturmak için bir arayüz sağlar.

Bağlantılı sayfanın altındaki PHP örnek vardır.

Sınıf bir nesnenin sınıfını değiştirme (hatta mümkünse bu dillerin çoğu yok.,.) Iyi bir fikir gibi gelmiyor

Ben rapor numaralar / türlerini depolamak için bir karma harita ile birlikte, bu için Prototype tasarım deseni kullanmak istiyorsunuz.

Yani sonunda kod olacaktır:

$reportObject = $reportTypes[15678]->clone();

this daha fazla bilgi ve örnekler için bkz.

Yardımcı olabilecek bir yolu Yük davranışı tutmak ReportLoader sınıf var ve oluşturmak için gidiyoruz rapor nesnesinin türüne karar vermektir. Bu şekilde rapor sorumluluğu raporlama olacak ve Loader doğru nesne sorumluluk içine doğru veri yükleme olacaktır.