インターフェイスの背後にある実際の型を知る必要があるときはいつでも、インターフェイスを導入するために間違ったポイントを選択した可能性があります。こちらはこんな感じです。
結果をログに記録するロジック (この場合はテキスト ファイルですが、他のターゲットが存在する可能性があります) からロジック (データを生成する) を実行することへの懸念を分離したいようです。ResultLogging のインターフェースを導入してみませんか?
interface IResultLogger
{
void LogList(List<Something> data);
void LogDataTable(DataTable data);
}
このインターフェイスのインスタンスを、ロジックを実行するすべてのメソッドに渡しますか?
これらのメソッド内に「ロギング」(IResultLogger インターフェイスの呼び出し) を行いたくない場合は、別の抽象化を追加することができます: 「ResultData」の概念です。
abstract class ResultData
{
abstract public void LogToResultLogger();
//add methods to access the data in a way you might need for other things in your program
}
「ListResultData」と「DataTableResultData」を導出します。
ここでは、ファクトリ パターンの価値はわかりません。
それを行う別の方法は、
class ListLogger
{
public void LogList(List<Something> data) {}
}
と
class DataTableLogger
{
public void LogDataTable(DataTable data) {}
}
そして、やります
void method1() and method2()
{
//do logic
new ListLogger().LogList(data);
}
void method3()
{
//do logic
new DataTableLogger().LogDataTable(data);
}