Новая версия платформы MetaTrader 5 build 2085: Интеграция с Python и массовые улучшения в тестере стратегий - страница 48

 
Alexey Navoykov:

Пусть даже в С++ по какой-то причине это запрещено,

Потому что есть базовые принципы ООП: изменения в базовом классе не должны влиять на поведение производного

 
Ilyas:

К сожалению, пока не добавили инструкцию using, придётся заводить в производном классе нужную перегрузку из которой вызвать родительский метод

Так а ввод using планируется?   Как насчёт отложить запрет до того момента, когда в языке появится необходимый инструментарий?   Сейчас вы создаёте программисту проблему на ровном месте, не предложив ничего взамен, и вынуждая городить костыли.  В стандарте C++ ведь, очевидно, всё было заранее продумано, прежде чем вводить ограничения.  Поэтому всё решается просто и элегантно:

struct A
{
	char a;
        int       Test(int);        
	int       Test(int, int);
        int       Test(int, int, int);
        int       Test(int, int, int, int);
};

struct B : A
{
        int  Test(int, int, int, int, int);
        using A::Test;  // Убиваем сразу всех зайцев одним махом
};

А вы предлагаете городить в MQL портянку:

struct A
{
        int Test(int);
        int Test(int, int);
        int Test(int, int, int);
        int Test(int, int, int, int);
};

struct B : A
{
        int Test(int a) { return A::Test(a); }
        int Test(int a, int b) { return A::Test(a, b); }
        int Test(int a, int b, int c) { return A::Test(a, b, c); }
        int Test(int a, int b, int c, int d) { return A::Test(a, b, c, d); }
        int Test(int a, int a, int b, int c, int e) { return 0; }
};

Больше кода - больше вероятность сделать ошибку.

И главное - чего ради всё это?  Неоднозначности тут нет, сигнатуры функций разные, поэтому вероятность вызвать не тот метод - отсутствует.  Если конечно не брать в расчёт возможность передать неверное число аргументов,  но с таким же успехом можно перепутать и в обычной перегруженной функции.  Т.е. ограничение в данном случае никак не улучшает надёжность кода, никакого практического смысла в нём нет. Сделано просто для занудства?

В C++ всё решается одной короткой строчкой, поэтому подобное занудство там не является проблемой.

 

К слову, в C# данного ограничения НЕТ.  А этот язык известен своей большей строгостью, нежели C++.

class A { public int Test(int a) { return 0; } }

class B : A { public int Test(int a, int b) { return 0; } }

class Program
{
   static void Main(string[] args)
   {
     B b = null;
     b.Test(1);  // Всё ОК
   }
}

 Поэтому, считаю, не стоит слепо копировать всё подряд из C++ чисто для галочки, без конкретной практической пользы.  Нагромождение лишнего кода, не улучшающее его надёжность, сулит больше проблем, чем пользы.

 

Компилятор правильно делает, что ругается и предлагает переписать.

Это же на 100% самоубийственный код, специально созданный для обязательных ошибок.

Тут не потакать надо заведомо опасным конструкциям, а наоборот удерживать от них.

 
Renat Fatkhullin:

Компилятор правильно делает, что ругается и предлагает переписать.

Это же на 100% самоубийственный код, специально созданный для обязательных ошибок.

Тут не потакать надо заведомо опасным конструкциям, а наоборот удерживать от них.

В чём конкретно его самоубийственность, можете объяснить?  Чем вот этот вариант лучше:

void Test(int a) { }

void Test(int a, int b) { }

И почему C# не ругается?  Считаете, что компилятор там менее правильный?

 
Покажите полный код для воспроизведения и укажите, что именно вам в нем не нравится, пожалуйста.
 
Alexey Navoykov:

И почему C# не ругается?  Считаете, что компилятор там менее правильный?

В C# нет множественного наследования, другая концепция и сравнение некорректно. В C++ там уже подумали сто раз как надо, чтобы не наступать на грабли

 
Alexey Navoykov:

В чём конкретно его самоубийственность, можете объяснить?  Чем вот этот вариант лучше:

И почему C# не ругается?  Считаете, что компилятор там менее правильный?

Если о причинах, то лучше ответ Страуструпа (The Design and Evolution of C++):

В плюсах таки можно объединить кандидаты с двух классов для перегрузки, надо лишь (не заметил в обсуждении выше):

class A {
   public:
                     A(void) {}
                    ~A(void) {}
      void           Test(void) {}
  };
class B : public A{
   public:
        using A::Test;
                     B(void) {}
                    ~B (void) {}
      void           Test(int a) {}
  };

Наверное, лучше до конца следовать плюсовому стилю, а не делать смесь всего на свете?

 
Ilyas:
Спасибо, внёс исправление.

Извините, не подскажете как удалить в Тестере историю его работы с ликвидацией вот этих элементов? Очистка/удаление папок Тестера не помогает.

тестер

 

Баг

Вложенные директории в Навигаторе на втором уровне и глубже сортируются в обратном порядке. win7x64, mt5x64.


Неверная сортировка папок