Изменение типа Коллекции от Интерфейса до Реализующего класса - PullRequest
0 голосов
/ 06 декабря 2018

Если у меня есть интерфейс с методом, который возвращает коллекцию чего-либо, можно ли вместо этого вернуть реализацию типа коллекции?

Например:

public interface IVehicle
{
    IEnumerable<Part> GetParts(int id);
}

public class Car : IVehicle
{
    List<Part> GetParts(int id)
    {
        //return list of car parts
    }
}

public class Train : IVehicle
{
    IEnumerable<Part> GetParts(int id)
    {
        //return IEnumerable of train parts
    }
}

Еслинет, почему бы и нет?

По крайней мере, для меня это имеет смысл.

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Нет, C # не поддерживает ковариацию для возвращаемого типа унаследованных методов.

Поддерживает ли C # ковариацию возвращаемого типа?

0 голосов
/ 06 декабря 2018

Вы, конечно, можете возвратить любую реализацию IEnumerable<Part> в качестве подробности реализации вашего GetParts метода (например, Train может легко вернуть List<Part>).Но сигнатуры метода должны точно совпадать с между определением интерфейса и реализацией класса этого метода.

Здесь (в отличие, например, от перегрузки) сигнатура метода включает в себя тип возврата метода.Так что нет, вы не можете написать Car как показано или что-то подобное.Вы, конечно, можете иметь метод GetParts, который возвращает , возвращающий List<Part>, но который не будет удовлетворять требованию интерфейса - для которого вы можете вместо этого предоставить явную реализацию:

public class Car : IVehicle
{
    List<Part> GetParts(int id)
    {
        //return list of car parts
    }
    IEnumerable<Part> IVehicle.GetParts(int id) => this.GetParts(id);
}
...