2012-08-27 68 views
1

我要實現靜態調用像File.XLS.Export(columnNames, dbNames);File.CSV.Export(delimiter, columnNames, dbNames);設計具有相同名稱的不同簽名的派生類中

現在我設計了一個抽象類,讓CSV和XLS繼承它。 正如你所看到的,我使用CSV導出時可能需要一個不同的簽名。我可以做一個重載,但是我不想在XLS導出中看到那個過載,因爲它在那裏完全沒用。

那麼如何在我的XLS導出中隱藏這個特定的實現?有沒有可以使用的圖案?

回答

0

經過一些方法後,我打算用ExtensionMethods來做。它似乎最適合我們的環境。

2

我會說檢查出Liskov Substitution Principle。歸結到同一個抽象的兩個具體實現應該是可以互換的。如果您在示例中將XLS替換爲CSV實現,則必須更改源代碼。

// Some client code 
// it has to be aware of differing implementations, so if this changes to CSV 
// this code changes 
File exported = XLS.export(columnNames, dbNames); 

而不是使用靜態方法,我贊成的方法,其中XLSExporter和CSVExporter都來自同一個基類派生,並具有完全相同的同一接口。我是一個Java的傢伙,但你應該能夠得到的想法:

public interface Exporter { 
    public File export(); 
} 

public class XLSExporter implements Exporter { 
    public XLSExporter(String[] columns, String[] databases) // specifics go in constructor 

    public File export() // ... 
} 

public class CSVExporter implements Exporter { 
    public CSVExporter(String delim, String[] columns, String[] databases) // specifics go in constructor 

    public File export() // ... 
} 

現在的出口商的客戶並不需要了解的不同參數。他們只是出口他們交給的任何東西。這將使你的代碼變得靈活和可維護。

// new client code 
// doesn't care about what kind of exporter it is, it just executes what it's given 
File exported = exporter.export(); 
+0

感謝您的建議,但我需要將其設爲靜態,因爲我們現有的所有基本功能都是靜態的。 – UNeverNo

0

如果你需要這兩個函數是靜態的,那麼你不需要繼承。只需製作一個類,並在其中粘貼兩個不同的靜態函數,並使用不同的簽名和不同的實現。我認爲你是在過度設計它,特別是在考慮現有代碼庫對你施加的唯一約束以使函數保持靜態時。

+0

你說得對。這就是爲什麼我得出結論使用擴展方法。我只想要兩個類中的相同方法名稱。 但現在我要(重載).ToXLS和.ToCSV – UNeverNo

相關問題