具有接口参数的接口方法,其中实现具有自己的类作为参数

时间:2019-02-24 15:12:16

标签: c# generics inheritance methods interface

假设我具有以下界面:

interface IShape
{
    bool Intersect(IShape shape);
}

然后我想要以下具体实现:

class Circle : IShape
{
    bool Intersect(Circle shape) {...}
}

class Rectangle : IShape
{
    bool Intersect(Rectangle shape) {...}
}

在C#中有没有使用泛型的聪明方法? 即不是这样的任何方式:

interface IShape<T> where T : IShape<T>
{
    bool Intersect(T shape);
}

class Circle : IShape<Circle>
{
    bool Intersect(Circle shape) {...}
}

2 个答案:

答案 0 :(得分:1)

为了说明我的评论:

interface IShape
{
    bool Intersect(IShape shape);
}

class Circle : IShape
{
    public bool Intersect(IShape shape)
    {
        switch (shape)
        {
            case Circle circle:
                // Circle / circle intersection
                break;

            case Rectangle rectangle:
                // Circle / rectangle intersection
                break;

            ....

            default:
                throw new NotImplementedException();
        }
    }
}

或者使用完全不同的类来处理交叉点,如Eric Lippert's article

答案 1 :(得分:0)

您可以使用像这样的显式接口实现:

interface IShape
{
    bool Intersect(IShape shape);
}

class Circle : IShape
{
    bool IShape.Intersect(IShape shape) { return Intersect((Circle)shape); }
    public bool Intersect(Circle shape) { ... }
}

但是,这会使您的代码非常不安全,因为您可以编写类似这样的内容并仍然通过编译:

IShape s = new Circle();
s.Intersect(new Rectangle());

以上内容将在运行时引发异常。

请谨慎使用。