Как использовать интерфейс в интерфейсе - PullRequest
0 голосов
/ 17 января 2019

Я хочу создать интерфейс, который может обрабатывать несколько других объектов одного интерфейса.

Я попытался использовать интерфейс в интерфейсе и использовать объект в новом классе.

public interface IObject
{
    double Value { get; set; }
}

public class FirstObject: IObject
{
    double Value { get; set; }
}

public class SecondObject: IObject
{
    string Titel { get; set; }
    double Value { get; set; }
}

public interface ICollection
{
    IObject[] Values { get; set; }
}

public class Collection: ICollection
{
    SecondObject[] Values { get; set; }
}

Теперь я получаю сообщение об ошибке, что мой Collection не реализует элемент IObject[] Values.

Я думал, что когда я использую объект (SecondObject), который реализуется из интерфейса IObject, Collection должен справиться с этим.

Что я делаю не так и как я могу это решить?

1 Ответ

0 голосов
/ 17 января 2019

Вы можете быть лучше здесь, используя дженерики:

public interface ICollection<T> where T : IObject
{
    T[] Values { get; set; }
}

public class Collection : ICollection<SecondObject>
{
    public SecondObject[] Values { get; set; }
}

Причина, по которой это не работает сейчас, заключается в том, что подпись должна точно совпадать. Это означает, что Values должен быть массивом IObject, а это не так. Используя обобщения, вы можете решить эту проблему, сохранив ограничение типа.

Вторым, но нецелесообразным решением будет использование явной реализации интерфейса:

public SecondObject[] Values { get; set; }

IObject[] ICollection.Values
{
    get
    {
        return this.Values;
    }
    set
    {
        this.Values = value?.Cast<SecondObject>().ToArray();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...