Я должен сказать, что я думаю, Ричард был немного трудным - его ответ так же хорош, как и Джейсон , в том, что они оба ответили только на половину вопроса, Соедините их вместе, и у вас будет полный ответ.
Чтобы это работало с IDbCommand
, DbCommand
& SqlCommand
, должна быть явная реализация IDbCommand
в DbCommand
( ответ Джейсона ) и публичный метод теневого копирования в SqlCommand
( ответ Ричарда ).
Я дам полный "Foo / Bar"пример.
Начните с этих интерфейсов:
public interface IFoo
{
IBar GetBar();
}
public interface IBar { }
Далее Foo
должен обеспечить явную реализацию IFoo
, чтобы возвращать Bar
, а не IBar
, из егособственный GetBar
метод:
public abstract class Foo : IFoo
{
IBar IFoo.GetBar()
{
return this.GetBar();
}
public Bar GetBar()
{
return this.GetBarInner();
}
protected abstract Bar GetBarInner();
}
public abstract class Bar : IBar { }
И, наконец, класс SomeFoo
должен затенять GetBar
, чтобы иметь возможность вернуть SomeFoo
экземпляр:
public class SomeFoo : Foo
{
public new SomeBar GetBar()
{
return new SomeBar();
}
protected override Bar GetBarInner()
{
return this.GetBar();
}
}
public class SomeBar : Bar { }
Я думаю,Единственная информация, которую Ричард, это то, что, добавив ключевое слово new
к затененному методу, вы избавляетесь от ошибки компилятора.