2013-01-22 25 views
0

我是OOP的新手,我處於以下情況:我有一些報表「引擎」用於多個報表,唯一需要的是是配置文件的路徑。OOP:類繼承添加一個屬性vs構造函數參數

我會在Python代碼,但是這是一個不可知論者question.So,我有以下兩種方法

A)類ReportEngine是一個抽象類,它具有所需的一切,但對於配置的路徑文件。這樣,你只需要實例化ReportX類

enter image description here

class ReportEngine(object): 
    ... 

class Report1(ReportEngine): 
    _config_path = '...' 

class Report2(ReportEngine): 
    _config_path = '...' 

report_1 = Report1() 

B)類ReportEngine可以通過配置文件路徑

class ReportEngine(object): 
    def __init__(self, config_path): 
     self._config_path = config_path 
    ... 

report_1 = ReportEngine(config_path="/files/...") 

哪一種方法是正確的實例化?如果它很重要,報表對象將被插入另一個類,使用組合。

回答

2

恕我直言A)的做法是,如果更好您需要實現彼此不同的報表引擎。如果您的報告使用不同的邏輯填充,請按照此方法。

但是,如果您的報表引擎中唯一的區別是_config_path我認爲B)方法是適合您的。顯然,用這種方法,無論報表類型如何,您都將擁有共享邏輯來構建每個報表。

+0

我同意:roto2: –

0

基本上主要的區別在於方法A比B更靈活(一個報告中沒有相互變化不影響其他報告),而B更簡單和更清晰(顯示差異的確切位置),但影響一個報告類型需要更多的工作。如果你非常肯定的報告將不隨時間變化 - 去B,如果你喜歡的分歧不會在未來很常見 - 去A.

1

一般說來,把所有的報告,在超級類。把具體的東西放在子類中。

所以你的情況,把_config_path在超ReportEngineB)(因爲報告有_config_path),但像實例化的具體報告中A),而每一次的報告可以設置其自己的路。

我不知道Python,但沒有爲正確的語法快速搜索的Python 3.0+,我希望這是有道理的:

class ReportEngine(object): 
    def __init__(self, config_path): 
     self._config_path = config_path 

    def printPath(self): 
     print self._config_path 
    ... 

class Report1(ReportEngine): 
    def __init__(self): 
     super().__init__('/files/report1/...') 

然後,

reportObj = Report1() 
reportObj.printPath() 

應打印

'/files/report1/...' 
+0

你的蟒蛇技能更多可以接受!但我仍然不完全看到這是正確的方式。像這樣做,我們失去了抽象的超類,同時我們得到了幾個子類。我認爲如果只有一種方法創建Report對象會更好(這樣您可以實例化子類或傳遞路徑的超類)。再說一遍,我對OOP有點新鮮,而且還沒有最好的把握。感謝你的回答! – bgusach

+0

我的意圖的確是'ReportEngine'類是* abstract *,但我不知道Python的語法如何。快速搜索顯示,這甚至是不可能的,但是有一種解決方法:http://www.boduch.ca/2010/04/python-abstract-class.html 然後再次,你去的方式取決於功能不同的階級。如果具體的ReportX類不會有所不同,但在config_path中,創建層次結構是沒有意義的。如果他們在更多的事情上有所不同,由於顧慮分離,你會對代碼感到滿意。 – Desty