C ++ / CLR - метод перегрузки внутри класса интерфейса - PullRequest
0 голосов
/ 30 апреля 2018

Есть ли способ назначить много сигнатур метода интерфейса для одной реализации?

Например, все, что ITransformable может быть перемещено по вектору или тройке координат:

public interface class ITransformable
{
public:
    void move(double x, double y, double z);
    void move(Vector ^ offset);
};

Такая запись обязывает программиста реализовать оба метода в каждом дочернем классе, но только один из них будет иметь полезное тело, а другие будут ссылаться на первый как

.
public ref class Thing : public ITransformable
{
    virtual void move(double x, double y, double z)
    {
        //Each child implements it in it's own way
        ...
    }
    virtual void move(Vector ^ offset)
    {
        //It is the same for all childs, copy it and paste everywhere
        move(offset->x, offset->y, offset->z);
    }
}

Есть ли что-то в этом роде:

public interface class ITransformable
{
public:
    //Implement me
    void move(double x, double y, double z);

    //Need no overriding anymore, just use implementation of the method above
    void move(Vector ^ offset) : move(offset->x, offset->y, offset->z);
};

без множественного наследования (скажем, Thing унаследовал некоторый неинтерфейсный класс, поэтому ITransformable не может быть абстрактным классом).

1 Ответ

0 голосов
/ 30 апреля 2018

Нет способа сделать то, что вы ищете. Интерфейсы чисты, никогда не содержат никаких реализаций.

Вы могли бы доказать, что два метода избыточны, и достаточно указать только один.

Самое близкое, что вы могли бы найти к тому, что вы искали, было бы, если бы обе из перегрузок принимали один параметр, и этот параметр можно было преобразовать. Например, определите метод для принятия VectorFloat, и вызов его с помощью VectorInt вызовет преобразование.

...