Скачать MetaTrader 5

Задачка по ООП MQL5. Выберите правильный вариант ответа (код ниже)

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Igor Volodin
4000
Igor Volodin  
  • 15%
    (8)
  • 28%
    (15)
  • 2%
    (1)
  • 6%
    (3)
  • 0%
    (0)
  • 50%
    (27)
Всего проголосовало: 54
Igor Volodin
4000
Igor Volodin  
class Base {
        protected:
                int value;
        public:
                void SetValue(int m) {
                        value = m;
                }
                virtual int GetValue() {
                        return (value);
                }
                
                void PrintResult() {
                        Print(GetValue());
                }
};

class Square:public Base {
        private:
                int GetValue() {
                        return (value*value);
                }
};


Square s;
s.SetValue(5);
s.PrintResult();
Dmitry Fedoseev
43510
Dmitry Fedoseev  
В чем смысл опроса? Либо 25 либо ошибку отсутствия переменной value (в зависимости от protected или privare).
George Merts
3750
George Merts  

По идее, здесь явная логическая ошибка объявления наследования.

Функция объявляется паблик в базовом классе, а потом она же перегружается как приватная. После чего в коде из невиртуальной функции происходит ее вызов.

Зачем такие безбашенные действия ? Если мы хотим скрыть реализацию класса от внешних пользователей - надо все наследование Square делать приватным от Base

Лично я - никогда не использую приватные данные, только защищенные - вот, как раз для того, чтобы не возникало коллизий, кому можно обращаться к ним. Все наследники должны иметь право обращаться к собственным данным, и данным предка.

Ihor Herasko
9305
Ihor Herasko  
Опять 25))
Ihor Herasko
9305
Ihor Herasko  
George Merts:

Лично я - никогда не использую приватные данные, только защищенные - вот, как раз для того, чтобы не возникало коллизий, кому можно обращаться к ним. Все наследники должны иметь право обращаться к собственным данным, и данным предка. 

Так в этом случае так и есть: value - неприватный член класса Base. Только вот с виртуальным методом намудрено... 
Igor Volodin
4000
Igor Volodin  

Простой же пример. Это тот случай, когда базовый класс задает интерфейс взаимодействия с клиентом. А все дочерние лишь влияют на реализацию.

Причем в mql5 как и в c++ переопределяющий метод может иметь любой модификатор доступа.

А вот в Java, Delphi, например, модификатор доступа переопределенных методов дочерних классов может идти только в сторону расширения области видимости. 

George Merts
3750
George Merts  

На мой взгляд, это неверно. Доступ в наследниках может идти только в сторону сужения области видимости. Иначе так нарушается замысел базового класса. Если в базовом классе переменные предполагаются недоступными извне (или наследникам) - то эта идеология должна поддерживаться и наследниками.

Расширение области видимости в наследниках, на мой взгляд, чревато тем, что потом будет вобще непонятно, какие переменные доступны извне, а какие нет.

Igor Volodin
4000
Igor Volodin  
George Merts:

По идее, здесь явная логическая ошибка объявления наследования.

Если мы хотим скрыть реализацию класса от внешних пользователей - надо все наследование Square делать приватным от Base

class Square:private Base 

Это не позволит работать вообще с методами определенными в классе-интерфейсе

 

Зато делая вот так

privateint GetValue() 

не получится вызвать GetValue ну и любую другую функцию отвечающую за особенности реализации у объектов дочерних классов, запрещено.

Igor Volodin
4000
Igor Volodin  
George Merts:

Расширение области видимости в наследниках, на мой взгляд, чревато тем, что потом будет вобще непонятно, какие переменные доступны извне, а какие нет.


А вот тут сообщество Java программистов, да и C# (понижать область тоже нельзя)  бы с вами поспорило )

George Merts
3750
George Merts  
Igor Volodin:

Это не позволит работать вообще с методами определенными в классе-интерфейсе

Дык еще бы ! Если мы объявляем предка, как приватного (защищенного) - мы запрещаем работать со всеми его методами. Все правильно.

Igor Volodin:


А вот тут сообщество Java программистов, да и C# (понижать область тоже нельзя)  бы с вами поспорило )

Да, тут, скорее, спор больше религиозен, чем объективен.

Я исхожу из "безопасности" кода. Код должен быть как можно проще, прозрачнее, и все неоднозначности должны трактоваться с позиций ограничения прав.

Меня не раз выручало именно ограничение прав при наследовании. Беру класс, пытаюсь использовать - блин... защищенное наследование... что за чушь ? Кто мне не дает использовать защищенные данные ? А ну, определим функцию, дающую доступ к переменной... Упс... Совсем в другом месте появилась ошибка... Хм... не напрасно там защищенное наследование... Я, оказывается, подзабыл тонкости работы...

Возможно, я слишком "олдскульный" программист...

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий