抽象メソッドをオーバーライドし、現在オーバーライドしている基本クラスのメソッドを呼び出そうとすると、非常に奇妙な問題が発生します。
//In Dll "A"
namespace Rhino.Etl.Core.Operations
{
using System;
using System.Collections;
using System.Collections.Generic;
public class Row {}
public interface IOperation
{
IEnumerable<Row> Execute(IEnumerable<Row> rows);
}
public abstract class AbstractOperation : IOperation
{
public abstract IEnumerable<Row> Execute(IEnumerable<Row> rows);
}
public abstract class AbstractDatabaseOperation : AbstractOperation
{
}
public abstract class SqlBulkInsertOperation : AbstractDatabaseOperation
{
public override IEnumerable<Row> Execute(IEnumerable<Row> rows)
{
Console.WriteLine("SqlBulkInsertOperation");
return rows;
}
}
}
//In console app "B"
namespace MyStuff
{
using System;
using System.Collections;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
ActualEtlOperation e = new ActualEtlOperation();
e.Execute(new Row[0]);
Console.ReadLine();
}
}
public abstract class SqlBulkInsertWithTruncateOperation : SqlBulkInsertOperation
{
public override IEnumerable<Row> Execute(IEnumerable<Row> rows)
{
Console.WriteLine("Truncate");
base.Execute(rows);
return rows;
}
}
public class ActualEtlOperation : SqlBulkInsertWithTruncateOperation
{
}
}
基本的に、SqlBulkInsertOperationは必要な処理を実行しないため、Execute(rows)を呼び出す前後に、オーバーライドして少し作業を行う必要があります。ただし、SqlBulkInsertOperation.Execute(Rows)のコードは実行されません。
Visual Studioのデバッガーでこのコードを実行すると、デバッガーはコードを実行しません。Visual Studioエディターで「base」の上にマウスを置くと、基本クラスのタイプがSqlBulkInsertOperationであることがわかります。
私は何が欠けていますか?