Общий интерфейс и приведение класса / вверх не работает - PullRequest
0 голосов
/ 26 мая 2018

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

Рассмотрим следующий код:

Интерфейс: -

public interface IObject<T>
{
    T Value { get; }
}

Реализация: -

public class MyObject<T> : IObject<T>
{
    private T value;

    public MyObject(T value)
    {
        this.value = value;
    }

    public T Value => value;
}

public class SquareObject : MyObject<Square>
    {
        public SquareObject(Square square) : base(square)
        {

        }
    }

Вспомогательные классы и интерфейс: -

public interface IShape
{

}

public abstract class Shape : IShape
{
    public abstract int Area();
}

public class Square : Shape
{
    int length;

    public Square(int len)
    {
        length = len;
    }

    public override int Area()
    {
        return length * length;
    }
}

Мой вопрос: когда я выполняю приведение квадратного объекта к форме, он работает нормально.

IShape shape = new Square(5);

Но когда я делаю то же самое, используя MyObjectуниверсальный класс, он не работает.

var square = new Square(5);
IObject<IShape> gShape = new MyObject<Square>(square);

Он говорит: «Не удается неявно преобразовать тип MyObject<Square> в IObject<IShape>».Может быть, я могу исправить это с помощью кастинга.Разве это возможно без приведения?

Точно так же я также не могу сделать то же самое, используя класс SquareObject.

var square = new Square(5);
IObject<IShape> shapeObj = new SquareObject(square);

Он говорит: «Не удается неявно преобразовать тип SquareObjectдо IObject<IShape> ".Может быть, я могу исправить это с помощью кастинга.Это возможно без литья?

1 Ответ

0 голосов
/ 26 мая 2018

Вы можете объявить ваш IObject интерфейс как ковариантный, используя

public interface IObject<out T>
{
    T Value { get; }
}

Covariant означает, что вы можете назначить объект, реализующий IObject<Derived>, переменной типа IObject<Base>.Документацию можно найти здесь .


Без явного указания ковариации ваш MyObject<Square> является IObject<Square>, но его нельзя присвоить переменной типа IObject<IShape>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...