Задать вопрос
Bobik4556Ttft
@Bobik4556Ttft
Тот ещё Мухтар

Можно ли в C# заменить метод в интерфейсе методом с тем же названием, но другой сигнатурой в наследуемом интерфейсе?

67fe72b3b67d9661099332.png
Ну, например, есть интерфейс IParameter, он обязывает реализовать метод void Put(object? argument);
А есть обобщенный интерфейс IParameter<T>. Можно ли в интерфейсе, или в классе Parameter<T>, реализующим интерфейс IParameter<T> закрыть void Put(object? argument) методом void Put(T? argument)? Имею в виду, чтобы не нужно было оба метода реализовывать.
public interface IParameter
{
    void Put(object? argument);
}
public interface IParameter<T> : IParameter
{
    void Put(T? argument);
}


А сейчас, пока что вот так.
67fe73015238f340496405.png
  • Вопрос задан
  • 59 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Может надо просто наследовать в обратном порядке, раз уж IParameter более общий?
public interface IParameter: IParameter<object>
{
    void Put(object? argument);
}
public interface IParameter<T>
{
    void Put(T? argument);
}
Ответ написан
Нет, нельзя перекрыть и в твоём случае не очень очевидно, как оно должно работать.
Твой первый интерфейс говорит, что метод Put должен принимать object - тоесть объект любого типа, а твой новый интерфейс почему-то сужает его до T, что делает его несовместимым.

Наследники могут только расширять аргументы, но не сужать.

Имею в виду, чтобы не нужно было оба метода реализовывать.

Можно в крайнем случае использовать это:
https://learn.microsoft.com/en-us/dotnet/csharp/la...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы