Метод интерфейса с параметром интерфейса, где реализации имеют свой собственный класс в качестве параметра - PullRequest
0 голосов
/ 24 февраля 2019

Предположим, что у меня есть следующий интерфейс:

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 голосов
/ 24 февраля 2019

Чтобы проиллюстрировать мой комментарий:

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();
        }
    }
}

Или используйте совершенно другой класс для обработки пересечений, как в Статья Эрика Липперта

0 голосов
/ 24 февраля 2019

Вы можете использовать явные реализации интерфейса, как это:

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());

Выше приведено исключение во время выполнения.

Используйте это с осторожностью.

...