1

File.XLS.Export(columnNames, dbNames);またはのような静的呼び出しを実現したいFile.CSV.Export(delimiter, columnNames, dbNames);

ここまでで、抽象クラスを設計し、CSV と XLS がそれを継承できるようにしました。ご覧のとおり、CSV エクスポートを使用する場合は別の署名が必要になる場合があります。オーバーロードを行うことはできますが、XLS エクスポートでそのオーバーロードを見たくありません。まったく役に立たないからです。

では、XLS エクスポートでこの特定の実装を非表示にするにはどうすればよいでしょうか? 使用できるパターンはありますか?

4

3 に答える 3

2

Liskov Substitution Principleをチェックしてください。つまり、同じ抽象化の 2 つの具体的な実装は交換可能でなければなりません。サンプルで 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();
于 2012-08-27T13:25:39.320 に答える
0

いくつかのアプローチの後、ExtensionMethods を使用して実行します。私たちの環境に最も適しているようです。

于 2012-08-28T06:33:52.567 に答える
0

2 つの関数を静的にする必要がある場合は、継承は必要ありません。単一のクラスを作成し、異なる署名と異なる実装を持つ 2 つの異なる静的関数をそのクラスに貼り付けるだけです。特に、関数を静的にするために既存のコードベースによって課せられる一意の制約を考慮すると、過剰に設計していると思います。

于 2012-08-28T06:41:17.510 に答える