Создать общую коллекцию производных интерфейсов из коллекции базовых интерфейсов - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть базовый интерфейс

public interface IBase
{
    ...
}

и интерфейс, производный от этой базы

public interface IChild : IBase
{
    ...
}

В моем коде я вызываю метод, который возвращает мне List<IBase>(устаревший код).Этим списком я пытаюсь заполнить ObservableCollection<IChild>:

List<IBase> baseList= GetListofBase();
ChildList = new ObservableCollection<IChild>();

// how to fill ChildList with the contents of baseList here?

Я знаю, что невозможно привести от базы к производному интерфейсу, но возможно ли создать производный экземпляр из базыинтерфейс

Ответы [ 2 ]

0 голосов
/ 27 сентября 2019

Вы не можете заполнить ObservableCollection<IChild> с List<IBase>.

Вы можете заполнить ObservableCollection<IBase> только List<IChild> из-за правил теории наследования.

Поскольку IBase является сокращенной версией IChild, типы не могут совпадать: вы не можете преобразоватьIBase в IChild.

Поскольку IChild - это расширенная версия IBase, типы могут совпадать: вы можете конвертировать IChild в IBase.

Например, автомобиль Toyota - это автомобиль, но все автомобили не являютсяТойота, так что вы можете действовать на Тойоту, как будто это Автомобиль, но вы не можете действовать на Тойоту, как будто это Тойота, потому что у Тойоты есть некоторые вещи и возможности, которых нет у абстрактной машины.

Посмотрите этот урок о том, что эта концепция одинакова для классов и интерфейсов:

Что такое наследование

Страница Википедии о наследовании:

https://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)

0 голосов
/ 27 сентября 2019

Легким подходом для этого будет наличие конструктора в вашем дочернем классе, который принимает IBase.

public interface IBase
{
}

public interface IChild : IBase
{
}

public class ChildClass : IChild
{
    public ChildClass(IBase baseClass) {
        // Do what needs to be done
    }
}

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

...