1

次のクラス階層があります。

interface IReportGenerator {

    public function setTitle ($title);

    public function setColumns ($columns);

    public function setPrintArea ($start, $stop);

    public function setPageOrientation ($value);

    public function createReport ($data);

    public function saveReport ($name, $path = null);

    public function saveReportAs ($name, $path = null, $type = null);
}

abstract class AbstractReportGenerator implements IReportGenerator {
    public function __construct() {
        $this->report = new PHPExcel();
    }

    public function setTitle ($title, $now = false) {
        // store

        return $this;
    }

    public function setColumns ($columns) {
        // store

        return $this;
    }


    public function setPaperSize ($value, $now = false) {
        // store

        return $this;
    }

    public function setPageOrientation ($value, $now = false) {
        // store

        return $this;
    }

    public function setPrintArea ($start, $stop, $now = false) {
        // store

        return $this;
    }

    public function saveReport ($name, $path = NULL) {
        return $this->saveReportAs($name,$path,self::EXCEL_2007);
    }

    public function saveReportAs ($name, $path = NULL, $type = NULL) {
        // save report

        return $this;
    }

    public function createReport ($data) {
        $this->doHeader();

        $this->doTitle();

        $this->doColumnHeaders();

        $this->doData($data);

        $this->doFooter();

        $this->doFormatting();

        $this->doMargins();

        $this->doPrintOptions();
    }

    abstract protected function doHeader();

    abstract protected function doTitle();

    abstract protected function doColumnHeaders();

    abstract protected function doData($data);

    abstract protected function doFooter();

    abstract protected function doFormatting();

    abstract protected function doMargins();

    abstract protected function doPrintOptions();
}

class ReportGeneratorSimple extends AbstractReportGenerator {
    public function __construct() {
        parent::__construct();
    }

    protected function doHeader () {
        // do nothing
    }

    protected function doTitle () {
        echo 'title A';
    }

    protected function doColumnHeaders () {
        echo 'column A';
    }

    protected function doData ($data) {
        echo 'data A';
    }

    protected function doFooter () {
        // do nothing
    }

    protected function doFormatting () {
        echo 'format A';
    }

    protected function doMargins () {
        // do nothing
    }

    protected function doPrintOptions () {
        // do nothing
    }
}

class ReportGeneratorFormatted extends ReportGeneratorSimple {
    public function __construct() {
        parent::__construct();
    }

    protected function doHeader () {
        parent::doHeader();
    }

    protected function doFooter () {
        parent::doFooter();
    }

    protected function doFormatting () {
        parent::doFormatting();

        echo 'format B';
    }
}

私がする時:

$report = new ReportGeneratorFormatted();
$report->setTitle('title');
$report->setColumns($columns);
$report->createReport($data);
$report->saveReport('file.xlsx');

私が得る出力は(順不同)です:

'data A'
'format A'

「タイトル A」、「列 A」、および「フォーマット B」が印刷されない理由がわかりませんか? saveReport() および saveReportAs() メソッドも機能しています。

4

1 に答える 1

0

@zerkins - あなたは正しいです、私が提供したコードは期待どおりに実行されます。私が提供した結果は、サンプルではなく製品コードからのものです。

サンプルが正しく機能したことを考えると、製品コードの違いを追跡するのと同じくらい簡単でした。子クラスの 1 つで「親」への呼び出しが欠落していることが判明しました。

ありがとう!

于 2013-02-12T19:54:23.927 に答える