特定上下文中的继承与组合

时间:2017-05-05 02:37:23

标签: oop inheritance composition

我对使用垂直继承或组合进行简单的OOP实现有了第二个想法。我已经阅读了很多,但我仍然不好下定决心。 ^^

我需要制作四种不同的报告:报价,发票,目录和手册: - 每个报告都有相同的页眉和页脚。 - 报价和发票包含具有不同数据的相同格式表。 - 宣传册和目录与其他报告的结构不同,没有表格。

我想在这里提出OOP设计方面的帮助;我将介绍我的两个想法(伪代码),但任何反馈将不胜感激。 :)

继承后

class Report
{
    method Header()
    {
        // Print the header
    }

    method Footer()
    {
        // Print the footer
    }
}

class ReportTable
{
    method Table()
    {
        // Print the table
    }
}

class Quote extends ReportTable
{
    method BuildReport()
    {
        call Header()

        call Table()
        // Print some more quote stuff

        call Footer()
    }
}

class Invoice extends ReportTable
{
    method BuildReport()
    {
        call Header()

        call Table()
        // Print some more invoice stuff

        call Footer()
    }
}

class Catalogue extends Report
{
    method BuildReport()
    {
        call Header()

        // Print catalogue stuff

        call Footer()
    }
}

class Brochure extends Report
{
    method BuildReport()
    {
        call Header()

        // Print brochure stuff

        call Footer()
    }
}

关于表格功能的撰写

    class Report
{
    method Header()
    {
        // Print the header
    }

    method Footer()
    {
        // Print the footer
    }
}

class Table
{
    method Table()
    {
        // Print the table
    }
}

class Quote extends Report
{
    property table

    constructor Quote( Table table )
    {
        self.table = table
    }

    method BuildReport()
    {
        call Header()

        call self.table.Table()
        // Print some more quote stuff

        call Footer()
    }
}

class Invoice extends Report
{
    property table

    constructor Invoice( Table table )
    {
        self.table = table
    }

    method BuildReport()
    {
        call Header()

        call self.table.Table()
        // Print some more invoice stuff

        call Footer()
    }
}

class Catalogue extends Report
{
    method BuildReport()
    {
        call Header()

        // Print catalogue stuff

        call Footer()
    }
}

class Brochure extends Report
{
    method BuildReport()
    {
        call Header()

        // Print brochure stuff

        call Footer()
    }
}

非常感谢! :)

1 个答案:

答案 0 :(得分:1)

这可能是一个宗教问题。无论哪种方式都应该工作,并且很容易从一个到另一个重构。标准逻辑说有利于构成而不是继承,但要采取正确的做法。