Я пытаюсь понять базовые концепции наследования и полиморфизма.но я застрял в одном сценарии.
Рассмотрим следующий код:
Интерфейс: -
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>
".Может быть, я могу исправить это с помощью кастинга.Это возможно без литья?