• Почему полиморфизм так работает?

    pi314
    @pi314
    Президент Солнечной системы и окрестностей
    Объяснить суть полиморфизма "на пальцах" довольно просто. Представьте себе класс Телефон. Его спроектировал некто в далеких 80-х, и определил в нем метод набратьНомер(). А потом другой программист в 90-х отнаследовал от него класс МобильныйТелефон и перекрыл метод набратьНомер(), т.к. грубо говоря, в новом устройстве набор производится уже не импульсно, а тонально. А потом третий программист отнаследовал от него класс Смартфон. При этом он не стал трогать метод набратьНомер(), а просто добавил методы для нового функционала, типа определитьПоложениеПоGPS() и т.д.

    Теперь представьте себе пользователя. Он родом из 80-х и понятия не имеет о тональном наборе и GPS... но если ему в руки дать любое из этих устройств, он сможет набрать номер и сделать звонок. Почему? Потому, что он умеет использовать метод набратьНомер(), и большего ему знать не нужно.

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

    Применительно к ООП, пользователь - это переменная, содержащая ссылку на экземпляр класса. Ее тип (как она была объявлена) - это "набор знаний" о возможностях этого экземпляра. И т.к. Смартфон в своей основе является Телефон-ом, мы вполне можем дать его в руки гипотетическому пользователю из 80-х:
    Телефон устройство = new Смартфон();
    в результате чего он сможет сделать звонок:
    устройство.набратьНомер("03");
    А вот определить свое местоположение он не сможет, пока не узнает о существовании соотв. метода:
    Смартфон усовершенствованноеУстройство = (Смартфон)устройство;

    Это называется приведением типа. В данном примере у экземпляра класса уже был соотв. метод, но чтоб им воспользоваться, нужно сначала явно указать, что мы хотим рассматривать имеющееся у нас в руках устройство не как "простой" Телефон, а как Смартфон.

    P.S. Кстати, в этом примере мы затронули не только полиморфизм, но и наследование, и инкапсуляцию (пользователя "снаружи" совершенно не интересует, как именно производится набор номера - тонально, импульсно или еще как-то иначе)... так сказать, все три кита ООП в одном флаконе. И только так вообще имеет смысл рассматривать эти принципы, т.к. они по сути неотделимы друг от друга, как Отец, Сын и Святой Дух в Христианстве или же длина, ширина и высота в трехмерном пространстве :) Если это понять, ООП становится совершенно простой и естественной парадигмой программирования.
    Ответ написан
    8 комментариев
  • Используете ли вы витамины для "мозга"?

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

    Во-вторых, на такие вопросы в интернетах чудовищное количество ответов, в основном оплаченных. Поэтому, когда вам будут настойчиво советовать пить обычный компливит, вспомните, что обычный ундевит от него отличается только ценой - раз в десять, правда... Ну, и найти его в аптеках труднее, особенно на витрине - там как раз красивые коробочки, прославленные телевизором.
    А так - попить витамины пару раз в год, для профилактики, никому еще не вредило. Но надеяться, что они дадут вам способности, которых у вас нет - как минимум наивно. Они разве что спасут от депрессии, хронической усталости и прочих состояний, граничащих с нерабочим. Подстегивать чем-то здоровый организм - это брать взаймы у собственного будущего. Очень не советую.
    Ответ написан
    8 комментариев
  • Что более перспективно?

    @abukhvalov
    Бездарность. Хуже Петросяна.
    Выбирай Java, это и мобильная разработка в конце концов. А фронтенд это рюшечки, кнопочки, формочки на аяксе и прочие мокрые письки. Те вещи, без которых можно прожить. От этого веет тоской, бессмысленностью и могильным холодом.
    Ответ написан
    3 комментария
  • Поздний старт в ИТ - есть ли шансы?

    zo0m
    @zo0m
    full stack developer
    какой-то вы неуверенный слишком
    я собеседовал достаточно много студентов и возраст скорее играет на вас
    "Что делал? тебе столько лет, а где опыт?", конечно спросят, только не для того чтобы вас топить, а для того чтобы понять что за человек сидит.
    Если на собеседованиях будете хорошо отвечать -- у вас нет причин не попасть куда-угодно.

    псц, ПОЗДНИЙ СТАРТ в 26 ??? я видел взрослых мужиков за 40 полностью меняющих работу на IT, а вам 26...

    чувак иди проспись
    Ответ написан
    6 комментариев
  • Стоит ли начинать заниматься программированием в 30+ если до этого не программировал?

    opium
    @opium
    Просто люблю качественно работать
    Вы так говорите как будто в 30 лет у вас нет рук и ног и вывалился глаз.
    Берите и делайте и меньше задавайте глупых вопросов на тостере.
    Ответ написан
    5 комментариев
  • Как пробраться через Java к Scala?

    @asd111
    Нет смысла. Scala мало используется. В Java 8 появились лямбды.
    Ответ написан
    5 комментариев
  • В чем разница new ArrayList() и new ArrayList()?

    Конкретно в данном случае в Java 1.7 и старше вы не получите никаких видимых отличий кроме наличия или отсутствия двух предупреждений при компиляции. Но, конечно, угловые скобки лучше писать. Отсутствие угловых скобок означает «сперва я конструирую непараметризованный вообще объект, а котом присваиваю его в переменную, используя небезопасное приведение типов», а наличие их означает «подбери подходящие параметры для объекта на основе контекста». Разница может проявиться, например, в таком коде:

    class NumberList<T extends Number> extends ArrayList<T> { ... }
    
    public static void main(String... args) {
        List<String> list = new NumberList();
        ...
    }


    Этот код компилируется (с предупреждениями), но у вас могут возникнуть странные проблемы в рантайме. Если же вы поставите две угловые скобки, тут же будет ошибка компиляции: подходящий тип вывести нельзя.
    Ответ написан
    Комментировать
  • Java REST. Как прописать в Path путь вида /get/group1/group2/...?

    FanKiLL
    @FanKiLL
    А зачем вы делаете это через Get, сделайте через чтобы запрос за группами или что вы там хотите отдать через пост. Например на урл - /get/groups вам отправляют список групп в json и вы их оттуда заберёте. Так маппинг будет чище.
    Ответ написан
    1 комментарий
  • Как определить пол по фамилии и имени?

    @Timosha
    Только по заранее составленной базе и в случае если нет полной уверенности (например если имя Саша или Женя) предлагать пользователю уточнить.
    Ответ написан
    1 комментарий
  • Для чего код написали таким образом?

    EvolMate
    @EvolMate
    Developer
    Предполагаю, что переменную планировали использовать где-то дальше, или даже использовали, а потом необходимость пропала. А рефакторинг денег стоит. А 1С очень жадные.

    UPD: Думаю, у них раньше не было константы, а была переменная. Потом, в новых версиях, они заменили её константой, а старую переменную оставили для обратной совместимости.
    Ответ написан
    5 комментариев
  • Какой выбрать таскменеджер для студии со штатом 25 человек?

    alsap
    @alsap
    Попробуйте Redmine
    Большинству ваших критериев удовлетворяет. Можно настроить под свои нужды. Есть море плагинов. При необходимости можно написать свой. Документация хорошая, сообщество в наличии. Проект активно поддерживается и развивается.
    Ответ написан
    2 комментария
  • Выборка DISTINCT

    GeneMoss
    @GeneMoss
    void
    Может, лучше через GROUP BY?
    SELECT `id`, `value`
    FROM  `table` 
    GROUP BY  `value`;
    Ответ написан
    1 комментарий
  • Что будет с биткоином, когда вычислительной мощности не будет хватать, чтобы майнить?

    @Nc_Soft
    Будут гонять то что есть. Так как биткоины вполне делимы, то это не станет проблемой.
    Ответ написан
    1 комментарий
  • Выбор роутера для дома

    Maxim_ka
    @Maxim_ka
    Системный инженер
    Zyxel Keenetic Giga
    Ответ написан
    1 комментарий