我要實現靜態調用像File.XLS.Export(columnNames, dbNames);
或File.CSV.Export(delimiter, columnNames, dbNames);
設計具有相同名稱的不同簽名的派生類中
現在我設計了一個抽象類,讓CSV和XLS繼承它。 正如你所看到的,我使用CSV導出時可能需要一個不同的簽名。我可以做一個重載,但是我不想在XLS導出中看到那個過載,因爲它在那裏完全沒用。
那麼如何在我的XLS導出中隱藏這個特定的實現?有沒有可以使用的圖案?
我要實現靜態調用像File.XLS.Export(columnNames, dbNames);
或File.CSV.Export(delimiter, columnNames, dbNames);
設計具有相同名稱的不同簽名的派生類中
現在我設計了一個抽象類,讓CSV和XLS繼承它。 正如你所看到的,我使用CSV導出時可能需要一個不同的簽名。我可以做一個重載,但是我不想在XLS導出中看到那個過載,因爲它在那裏完全沒用。
那麼如何在我的XLS導出中隱藏這個特定的實現?有沒有可以使用的圖案?
經過一些方法後,我打算用ExtensionMethods來做。它似乎最適合我們的環境。
我會說檢查出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();
如果你需要這兩個函數是靜態的,那麼你不需要繼承。只需製作一個類,並在其中粘貼兩個不同的靜態函數,並使用不同的簽名和不同的實現。我認爲你是在過度設計它,特別是在考慮現有代碼庫對你施加的唯一約束以使函數保持靜態時。
你說得對。這就是爲什麼我得出結論使用擴展方法。我只想要兩個類中的相同方法名稱。 但現在我要(重載).ToXLS和.ToCSV – UNeverNo
感謝您的建議,但我需要將其設爲靜態,因爲我們現有的所有基本功能都是靜態的。 – UNeverNo