简体   繁体   中英

Classes implementing generic interfaces

Problem Description

I am struggling to get my generic interfaces to work. I have an IContainer<TShape> that takes a list of shapes, where the shapes must implement the IShape<TPoint> interface. The IShape<TPoint> interface has a list of points, where the points must implement the IPoint interface. The part that I am struggling with is the where constraint on the IContainer<TShape> interface.

The error I'm getting is:

The type 'TPoint' cannot be used as type parameter 'TPoint' in the generic type or method 'IShape'. There is no boxing conversion or type parameter conversion from 'TPoint' to 'Domain.Entities.IPoint'. [Domain]csharp(CS0314)

Interfaces

Container interface:

public interface IContainer<TShape, TPoint> where TShape : IShape<TPoint>
{
    public Guid Id { get; set; }
    public List<TShape<TPoint>> Shapes { get; set; }
}

Shape interface:

public interface IShape<TPoint> where TPoint : IPoint
{
    public Guid Id { get; set; }
    public List<TPoint> Coordinates { get; set; }
}

Point interface:

public interface IPoint
{
    public double X { get; set; }
    public double Y { get; set; }
}

Models

The way I would like my models to work is:

Container model:

public class Container : IContainer<Shape, Point>
{
    public Guid Id { get; set; }
    public List<Shape<Point>> Shapes { get; set; }
}

Shape model:

public class Shape: IShape<Point>
{
    public Guid Id { get; set; }
    public List<Point> Coordinates { get; set; }
}

Point model:

public class Point : IPoint
{
    public double X { get; set; }
    public double Y { get; set; }
}

What syntax is needed to make this work?

I believe the issue is that on IContainer you are only providing a type constraint for TShape, when IShape also requires a type constraint on TPoint.

Try modifying your IContainer interface to the following:

public interface IContainer<TShape, TPoint>
    where TShape : IShape<TPoint>
    where TPoint : IPoint
{
    public Guid Id { get; set; }
    public List<TShape<TPoint>> Shapes { get; set; }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM