Мне нужно вызвать метод абстрактной реализации класса. Но компилятор всегда по умолчанию использует перегруженный метод из конкретного класса, так как для подписи требуется только унаследованный тип.Метод вызова, перегруженный из абстрактного класса
Просто взгляните на код:
- это, очевидно, значительно упрощенная версия фактического кода, который я использую;)
public class ModelBase { }
public class ModelA : ModelBase { }
public interface IInterface<in TModel>
{
void Do(TModel model);
}
public abstract class AbstractClass<TModel> : IInterface<TModel>
{
public abstract void Do(TModel model);
}
public class ConcreteClass : AbstractClass<ModelA>, IInterface<ModelBase>
{
public override void Do(ModelA model)
{
// I'd like to invoke this method
}
public void Do(ModelBase model)
{
// how do I invoke the method above??
Do((ModelA)model);
}
}
^^ Это приводит к рекурсии
То, что я попытался это:
((IClass<ModelA>)this).Do((ModelA)model);
^^ ничего не меняет
base.Do((ModelA)model);
^^ выдает ошибку "не удается вызвать абстрактный элемент базы: 'AbstractClass.Do (Modela)"
Как я называю "общественное переопределение недействительной (модель Modela) Do" метод ?
кстати. Если изменить класс этого
public class ConcreteClass : IInterface<ModelA>, IInterface<ModelBase>
это работает.
Это выглядит как ошибка компилятора перегрузки распознаватель ... Что я упускаю –
Если я могу, почему у вас есть перегрузки который использует базовый тип, но затем делает вызов, предполагая, что тип является ModelA? Способ настройки перегрузки, я мог бы дать вам ModelB. –
Очень действительный вопрос @neoistheone. В основном у меня есть IRepository, который запрашивается. A Бетонный репозиторий . Теперь метод Insert вызывается в интерфейсе репозитория. Хотя это контравариантно, я не могу отдать IRepository в IRepository . поэтому я должен добавить наследование IRepository в конкретный репозиторий. –
Sam7