1. JavaScript / Говнокод #27543

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    namespace Ifaces {
        interface IFoo {
            foo(): number;
            bar(x: number): string;
            twoArg(x: number, y: number): number;
            baz: string;
        }
    
        class A implements IFoo {
            constructor() {
                this.baz = "Q" + "A";
            }
            foo(): number {
                return 12;
            }
            bar(v: number) {
                return v.toString();
            }
            twoArg(x: number, y: number) {
                return x;
            }
            baz: string;
        }
        class B extends A {
            foo(): number {
                return 13;
            }
        }
    
        function foo(f: IFoo) {
            return "" + f.foo() + f.baz + f.bar(42);
        }
    
        export function run() {
            print("Ifaces.run");
            let a = new A();
            assert("" + foo(a) + "X" == "12.QA42.X");
            assert((a as IFoo).twoArg(1, 2) == 1, "t");
            a = new B();
            assert("" + foo(a) + "X" == "13.QA42.X", "b");
            let q = a as IFoo;
            q.baz = "Z";
            assert("" + foo(q) + "X" == "13.Z42.X", "x");
            print("Ifaces.runDONE");
        }
    }
    
    function main() {
        Ifaces.run();
        print("done.");
    }

    хотел оставить вас в покое. но не смог. Ловите - fields в интерфейсах

    Запостил: ASD_77, 01 Августа 2021

    Комментарии (161) RSS

    • а где же дампик? а вот он бля -> https://pastebin.com/P85DSvfw
      Ответить
    • и результат работы

      C:\temp>C:\dev\TypeScriptCompiler\__build\tsc\bin\tsc.exe --emit=jit C:\temp\1.ts 
      Ifaces.run
      Ifaces.runDONE
      done.
      Ответить
    • Значит, теперь можно создавать классы без методов, чтобы получить структуры, наследующиеся от структур?
      Ответить
      • типа того
        Ответить
      • И какую проблему это решает, которую б без этой хуйни нельзя было бы решать? Если более коротко, то "а нахуя это нужно?"

        Можно ведь просто создавать структуры, а потом создавать функции, которые что-то с такими-то структурами делают.
        Ответить
        • В "D" кстати тоже есть "интерфейсы" https://dlang.org/spec/interface.html но опять-таки мне не очень понятно, нахуя это надо.
          Ответить
          • Интерфейс — это контракт, узелок на память, что нужно реализовать.

            Да, если бы были компайлтайм-функции, которые могли бы делать что-то с типами, дополнительные сущности были бы не нужны.
            Ответить
        • Забыл в "rotoeb" залогиниться.
          Ответить
        • это решает проблему унифицированного доступа для разных типов. и поля это один из обьектов унификации :)
          Ответить
    • В Swift кстати есть протоколы которые по своей сути похожи на тайпскриптовые интерфейсы: https://docs.swift.org/swift-book/LanguageGuide/Protocols.html . Вот что мне не понятно - так ето нафига было ограничивать наследование одним классом в Джаве например. Есть поля/методы с одинаковым именем но разными типами в структурках X и Y - бросаем ошибку компиляции, заставляем программиста резолвить конфликт указывая руками наследуемые элементы (был бы неплох механизм "частичного наследования" кстати).
      Ответить
      • Наследование ради реализации -- не самый красивый паттерн, как мне кажется... Да и с точки зрения LSP получается какой-то бред.

        Так что вместо "частичного наследования" я бы просто предложила что-то удобное для делегирования группы методов какому-нибудь полю. Типа мы пишем, что вся реализация IFoo в нашем классе отправляется в поле m_foo. Ну или поштучно, если надо детальнее.
        Ответить
        • о, расскажу багор

          в objc-шных протоколах (не путать с pure swift протоколами) есть @optional методы, которые можно не реализовывать.

          в сишарпе никакого @optional нет, потому в ксамарине всякие табличные делегаты приходится наследовать от (абстрактного?) класса, а не от интерфейса (потому что вместо @optional в классе пустые реализации, бросающие весёлые эксепшоны типа "you should not call this method in base")

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

          получается вербозненько, зато с разделением по ответственности
          Ответить
          • Эм, а что происходит на стороне обжси если я зову @optional метод у протокола, а в реализации его нету?
            Ответить
            • в общем случае будет экспепшен про unrecocknized selector, потому надо оборачивать такие вызовы в respondsToSelector
              Ответить
          • мужественное унаследование легко заменяется на композитный паттерн.
            Ответить
            • прикольно получилось со словом "множественное" :)
              Ответить
            • мужеложественное наследование
              Ответить
        • > что-то удобное для делегирования группы методов какому-нибудь полю
          Русту с его orphan rule точно бы не навредило.
          Кстати, я бы ещё подумал на тему явного экспорта/импорта реализации стороннего трейта над сторонним типом. Или они уже подумали?
          А ещё можно бы было позволить реализовывать сторонний трейт над сторонним типом, не выпуская реализацию за пределы модуля/пакета/чего-нибудь-ещё, чтобы не конфликтовало. И при появлении "официальной" реализации предпочитать локальную и выдавать предупреждение.
          Ответить
          • import pycpy # червепакаж для копирования
            Ответить
    • а я пропустил, конструкторы в интерфейсе можно описывать?
      Ответить
      • зачем?
        Ответить
        • странный вопрос

          затем, чтобы это было в контракте, не?
          Ответить
          • интерфейс — это уже проинициализированный объект и не требует повторного инициирования. не? а что бы создавать обьекты - то это просто метод в интерфейсе.
            Ответить
            • > интерфейс — это уже проинициализированный объект

              - што
              Ответить
              • имеется в виду что интерфейс описывает контракт взаимодействия с чем-то уже существующим

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

                        Там же в две фазы объект создаётся -- сначала память выделяешь (alloc), потом зовёшь на ней конструктор (init). Поэтому это не столько конструктор, сколько метод инициализации.

                        Какие сишные корни )))
                        Ответить
                        • в обжси init это в общем обычный метод, вернее message, а название не более, чем конвеншн
                          Ответить
                    • Совершенно нормальный кейс, если ты можешь изображать полиморфизм на уровне указателя на класс.

                      Псевдокот:
                      val pointerToBirdClass = *CPetuh
                      val ptitsa: IPtitsa = pointerToBirdClass.newInstance(koko)
                      Ответить
                      • Шта?! Ты же тут фабричный метод у класса позвал, а не конструктор IPtitsa...

                        Ну собственно в objc сначала фабричный alloc() у класса, а потом инициализатор init() у объекта.
                        Ответить
                        • Какого класса?

                          У всех классов IPtitsa обязан быть конструктор с аргументом "koko (тип сам выдумай:)), вот мой код не знает с каким именно классом он имеет дело
                          Ответить
                          • У того класса, объект которого ты хочешь создать.
                            Ответить
                            • Мой код не знает с каким классом он работает

                              Он только знает, что у него есть мтеод newInstance (он у всех классов есть в моем псевдокоте), но конкретная сигнатура задана интерфейсом

                              Хочешь -- называй это фабричным методом
                              Ответить
                              • Ну да, это прям классический пример фабрики. Можно на доску вешать и ученикам показывать.

                                Но newInstance() то не у тех объектов, которые ты создаёшь. Он у фабричных объектов (или инстансов класса класса, или чего там ещё).
                                Ответить
                                • Во-первых фабрика != фабричный метод.
                                  Фабрика обычно создает семейство объектов (например фабрика для создания виджетов)

                                  Во-вторых в java/c++/c# тебе всё равно придется иметь И конструктор И такой вот метод, который подготавливает данные, и вызывает конструктор (причем его еще приватным придется делать, чтобы там снаружи не дергали наверное)

                                  А в моем псевдокоте нет

                                  > Но newInstance() то не у тех объектов, которые ты создаёшь. Он у фабричных объектов (

                                  Почему?

                                  А конструктор у кого: у класса, или у объекта?
                                  Ответить
                          • Ответить
                            • А что вообще такое "конструктор"?
                              Чем он такой особенный? Почему нельзя представить его как malloc+init (как собссно и сделано в Objc, как ты верно и сказал)

                              Только тем, что в C++ он слит воедино во имя RAII?
                              Ответить
                              • Да в с++ он тоже двухфазный так то, просто первая фаза неявная если без new.

                                Ладно ок, пусть будет конструктором. В конце-концов в объектном паскале так же было.
                                Ответить
                                • В общем представь себе, что конструктор это не специальный метод, а просто конвенция такая: метод "ctor" там или "init" (как в яблоке)

                                  Тогда вполне логично его выразить в интерфейсе.
                                  Ответить
                                  • тут такое дело

                                    в свифте конструктор это спецметод в отличие от обжси

                                    но он точно так же может быть представлен в интерфейсе

                                    имхо это удобно, недавно хотел попользоваться в пет-проекте и соснул, потому что в шарпе этого нет
                                    Ответить
                                    • Приведи пример кода на свифте, когда ты вызываешь конструткор через интерфейс
                                      Ответить
                                      • ну у меня например есть какие-то визуальные элементы и модели, которые держат их состояния

                                        я хочу иметь generic метод, который будет внутри создавать такой элемент. это необязательно должна быть фабрика, он может элемент и не возвращать, а дальше куда-то передавать

                                        вот внутри этого метода я и буду звать такой конструктор
                                        Ответить
                                  • Опять на говнокоде какую-то хуйню обсуждают. С открытием!
                                    Ответить
                              • Если есть виртуальные методы, то нужно заполнить их таблицу.

                                Итого три фазы:
                                1. Молока. Хотя её можно отнести не к конструктору, а к «new».
                                2, Заполнение VMT.
                                3. Твой код (что могло бы быть выражено обычным методом).
                                Ответить
                                • Молоки не обязательны в крестах же: я могу отсчитать от указателя на головку стека и туда покласть

                                  VMT в каком-то смысле тоже часть выделения памяти и заполнения её нужными рантайму структурами
                                  Ответить
                                  • Не, вмт это уже более прикладная часть чем аллокация места. Она же после создания каждого предка обновляется, класс превращается во что-то большее.
                                    Ответить
                                    • Однако патчинг VMT это и не пользовательский код тоже
                                      Ответить
                                      • Пролог конструктора.
                                        Ответить
                                        • Ну да, пролог, почти как двигать указатель стека при входе в функцию
                                          Я не обязан это знать.

                                          А так вполне можно сделать язык Хуй++, где "конструктор" будет только выделять память и заполнять VMT оставляя неиинициализированной память, а потом ты будешь руками вызывать ``init``
                                          Ответить
                                          • Ну тогда нельзя будет из конструктора ничего виртуального звать. Иначе оно в финальный объект сразу прыгнет.

                                            Впрочем, это и так говнокод.
                                            Ответить
                                            • Точно: пока папка не сконструирован, и пиздюк не имеет права ничего вызывать из него




                                              А кстати что будет, если в конструкторе родителя вызвать виртуальный метод, который переопределен у потомка? Кроме говнокода что будет?
                                              Ответить
                                              • В конструкторе и деструкторе vmt настроена на уровень класса, который сейчас конструируется. Так, что ты видишь только себя и родителей, а потомка пока нет.

                                                Есть ненулевой шанс совершить сеппуку через pure virtual call, а в остальном всё норм.
                                                Ответить
                                                • То есть паттерн "шаблонный метод" соснёт в конструкторе.

                                                  У меня тупак, я забыл как это в жабе
                                                  Скорее всего либо так же, либо у тебя уже есть потомок, но у него все поля по нолям.


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

                                                      Попробуй сделать ему "final int" поле и в конскторе прописать туда "42", а из виртуального метода обратиться

                                                      там будет 0?
                                                      Ответить
                                                      • Ну да, при вызове из первых джвух предков 0, потом 42.
                                                        Ответить
                                                        • Я тут вспомнил, что Intellij подсвечивает вызов виртуальных (не "final") методов в конструкторе, и говорит не надо так делать

                                                          В крестах всё могло быть хуже, допусти они такое поведение, но в джаве "не инициализированной памяти" не бывает
                                                          Ответить
                                                          • Можно, если постараться, сделать как-то UB в джаве? Или может даже сегфолт?
                                                            Ответить
                                                            • Может быть можно через unsafe

                                                              Сегфол можно получить дёрнув нативный код, напимер через JNA. Я так делал, и совсем не специально:)
                                                              Ответить
                                                            • > Или может даже сегфолт

                                                              Без unsafe и нативных функций -- маловероятно.

                                                              Но поверхность атаки у JRE огромная, не удивлюсь, если какие-то изкоробочные либы крашатся в нативном коде при каких-то условиях. Побег из песочницы ведь был уже (собственно после него джаву и похоронили).
                                                              Ответить
                                                          • А еще я вспомнил что мы как-то нашли, что в JVM есть ``invokestatic`` и ``invokevirtual``, и даже для финального класса у которого впринципе не может быть потомков и для финального метода всё равно вызвается invokevirtual
                                                            Ответить
                                                  • А компиляторы/стандарт нельзя так настроить, чтобы нельзя было вызывать виртушню в конструкторах/деструкторах?
                                                    А для тех, кто хочет пострелять в ногу - сделать синтаксис в виде
                                                    kill_me_please_i_do_mean_it_please_please_please_cast<сигнатура метода>(метод)(аргументы)

                                                    Иерархию константных методов же компилятор умеет проверять.
                                                    Ответить
                                                    • Ну gcc кстати ругается если пишешь совсем уж явную фигню в духе вызова абстрактного метода напрямую. Но более тонкие кейсы он не понимает.
                                                      Ответить
                  • у вас в свифте и в жопу ебуца

                    никто не говорит что нельзя, говорят что не надо это
                    Ответить
                    • Вообще говоря в JS, Python, Java, Kotlin и C# в жопу ебутся в значительно бОльшей степени.

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

                      Как там в "драконе" у Шварца:

                      "Почему два, в сущности, больше, чем три"
                      Ответить
                    • Именно поэтому я за «PHP».
                      Ответить
                    • я правда так и не понял, почему это не надо, если мне надо, но ладно
                      Ответить
                      • Ты что, первый раз столкнулся с человечской логикой?

                        Если мне не надо, то значит никому не надо
                        Ответить
                      • Потому что семантически конструктор не относится к интерфейсу объекта. Точно так же, как и статические методы. Ты можешь описать эти констрейнты в языке одной сущностью, но семантически это констрейнты трёх разных категорий.
                        Ответить
                        • ну а я вот считаю, что относится)
                          Ответить
                          • Я и не собираюсь тебя переубеждать, я показываю где здесь логика.
                            Ответить
                        • >Потому что семантически конструктор не относится к интерфейсу объекта.

                          Совершенно не очевидно, чому так

                          > Точно так же, как и статические методы

                          В конкретных языках, угу. Но не везде так.

                          Вот бы сейчас представления из джав и шарпов выдавать за универсальные истины.
                          Ответить
                          • > Совершенно не очевидно, чому так

                            Потому что интерфейса объекта описывает взаимодействие с объектом, не с типом объекта.
                            Ответить
                            • Конструктор это часть объекта, а не его типа

                              Он переводит объект из одного состояния в другое.

                              Чем отличается (псевдокот)
                              koko = new Koko(123)
                              // от
                              koko = new Koko()
                              koko.setPepe(23)
                              Ответить
                              • Тем что ты описываешь как это исполняется в рантайме, а не сам дизайн.
                                Конструктор это функционал типа, не объекта.
                                Ответить
                                • Я не понял смысл этой фразы

                                  >Конструктор это функционал типа,
                                  Почему? Разве он работает с типом?
                                  Нет

                                  Он работает с объектом


                                  Освободи свои мысли от наследкников симулы, юный падаван

                                  Закрой глаза, и представь, что нет ни C++, ни Java с C#, а есть только посылка сообщения объекту "инициализируйся"
                                  Ответить
                                  • Механик работает с машиной, но сам машиной не является
                                    Ответить
                                    • И что? Причем тут это?

                                      Конструтор не трогает поля класса, он исполняется на объекте, когда память уже выделена, и основной аргумент его это "this" а не класс
                                      Ответить
                                      • А почему он должен трогать поля класса?

                                        > он исполняется на объекте

                                        В контексте объекта, при чем если уж мы пошли сюда, то большинство языков имеют ограничения по функционалу в конструкторе, которые не дают его присовокупить к остальным методам.
                                        Ответить
                                        • Покажи на классе, где он тебя трогал
                                          Ответить
                                • Это зависит от языка. В Python, няпример, конструктор — это метод, ничем от других методов объектя ня отличающийся.
                                  Ответить
                                  • Ну и чтобы нягляднее:
                                    >>> class X:
                                    ...     def __init__(self, foo):
                                    ...         print(f'Called X({foo}) constructor')
                                    ...         self.foo = foo
                                    ...
                                    >>>
                                    >>> x_obj = X(16)
                                    Called X(16) constructor
                                    >>> x_obj.__init__(42)
                                    Called X(42) constructor
                                    >>> print('x_obj.foo ==', x_obj.foo)
                                    x_obj.foo == 42
                                    Ответить
                                  • Иди своей дорогой, трап.
                                    Ответить
                                    • К чему эта дискриминация?
                                      Это же тот же самый гост, пусть даже он увлёкся аниме, и стал Полиной
                                      Ответить
                                      • И хуй отрезал?
                                        Ответить
                                      • Из уважаемого человека на говнокоде превратился в пидора.
                                        Ответить
                                        • > Из уважаемого человека на говнокоде превратился в пидора.

                                          А чего добился ты, анонимный вахтёр?
                                          Ответить
                                          • Я гомофоб
                                            Ответить
                                            • > Я гомофоб

                                              А почему ты их боишься? Есть какое-то рациональное объяснение? Или это какая-то подсознательная проблема.
                                              Ответить
                                              • > боишься

                                                Гомофобия - Ряд негативных установок и чувств по отношению к гомосексуальности или людям, которые идентифицируются или воспринимаются как ЛГБТ+. Термин «гомофобия» употребляется в европейских официальных документах, где в некоторых случаях это явление ставится в один ряд с расизмом, ксенофобией, антисемитизмом и сексизмом. Термин «гомофобия» часто критикуется из-за того, что не является полностью подходящим, так как гомофобия не является фобией в клиническом смысле.

                                                https://ru.wikipedia.org/wiki/Гомофобия
                                                Ответить
                                            • А сковородку в штанах держишь на сякий случай, чтобы тебя врасплох не застали?
                                              Ответить
                                              • Нет. А с какой стороны нужно?
                                                Ответить
                                              • > сковородку в штанах

                                                – удобно, можно сразу и яичницу пожарить
                                                Ответить
                                            • Я
                                              родился в лесу,
                                              а потом много лет
                                              Пропадал-прозябал в огороде.
                                              Только в прошлом году,
                                              ни к селу, на беду
                                              Полюбил я Володю.

                                              Так имело ли смысл
                                              целоваться в кино,
                                              Загорать и питаться порою умеренно мясом,

                                              Чтобы стать пидорасом?

                                              Шесть с половиной процентов зверей,
                                              Семь процентов людей
                                              И иных представителей
                                              Человеческой расы -

                                              Пидорасы...
                                              Ответить
                                        • > Из уважаемого человека на говнокоде превратился в пидора.

                                          А вообще, тебе не помешало бы извиниться.

                                          ГК, конечно, всегда славился прямотой высказываний и жёстким троллингом... но тут ты палку явно перегнул.
                                          Ответить
                                          • Ох, ты так серьезно воспринял слова Иньё?

                                            А когда мы пишем "сишкобляди соснули" или "поссал на прыщеблядь" ты тоже обижаешься?
                                            Ответить
                                            • Я и правда серьезно. Раньше я госта уважал, а теперь нет.
                                              Ответить
                                              • >Раньше я госта уважал, а теперь нет.

                                                А борманда тоже перестал уважать после того, как она о себе в женском роде писать начала?
                                                Ответить
                                                • Я думаю да. Ня то чтобы меня ебало чьё-то мнение...
                                                  Ответить
                                                • А давайте все писать в женском роде!

                                                  Я няпример могла поддерживать несколько диалогов разными персоняжами разного пола. Когда я общалась с другим персоняжем, который своими репликами подтверждал мою принядлежность к женскому полу, убедить в этом посторонних няблюдателей было проще. Потом я пользовалась белорыцарством большинства пользователей ММОРПГ и получала от них профит.
                                                  Ответить
                                                  • Я не буду о себе в женском писать: у меня никогда не возникало потребностей считать себя девочкой, но и поведение госта с бормандом меня не задевает (хотя конечно "няканье" малость подзаебало, почти как uwu owo)
                                                    Ответить
                                                    • А у меня случилась автоматическая толерантность к някам. Как бы Бормяунд ни старался вставлять внезапно, всё равно всё нормализовалось. Няки встали на уровень обычных слов.

                                                      А вот uwu owo меня бесит как Faux Cyrillic кириллицечитающих. Я эту питушню читаю как "уву" и "ово", а смайловое значение этих слов так и не гуглил, поскольку не так часто эта питушня встречается и не так много смысла добовляет.
                                                      Ответить
                                                  • > несколько диалогов разными персоняжами

                                                    Какой мультитаскинг )))

                                                    Линейка поди?
                                                    Ответить
                                                    • >Какой мультитаскинг )))

                                                      Недавно как раз думал: а на какой интфрейс в мультихоум хосте пойдет бродкаст, если я серану на 255.255.255.255 включив у сокета ``SO_BROADCAST``

                                                      Угадаешь?
                                                      Ответить
                                                      • На тот, куда роутится 0.0.0.0/0 и метрика поменьше?
                                                        Ответить
                                                        • На линуксе да, на других ОС может быть иначе (вплоть до посылки на все интерфейсы)

                                                          Правильное* решение это выбрать интерфейс через ``SO_BINDTODEVICE``


                                                          *насколько вообще бродкаст можно называть "правильным" решением
                                                          Ответить
                                                  • Я бы часто сбивалась. Приходилось бы постоянно перечитывать комментарии на ГК и в баг-трекере на работе, чтобы выяснить, что в каждом из случаев выбрана правильная форма слова.
                                                    Ответить
                                                    • > Я бы часто сбивалась.

                                                      Да ну, всё равно ведь несколько социальных контекстов умеешь поддерживать. Я вот, к примеру, не матерюсь если контекст этого не подразумевает и не пишу "прыщи" вместо "линукса" на работе. Точня так же и с няканьем.

                                                      Главное, чтобы были какие-то явные и чёткие индикаторы какой контекст сейчас активен.
                                                      Ответить
                                                      • >и не пишу "прыщи" вместо "линукса" на работе.
                                                        а я давеча чуть было не
                                                        Ответить
                                                      • Для меня это наверно слово "питушня". И то сложновато его не произносить вне ГК, т.к. оно так универсально всё описывает и прошло бы цензуру на ТВ.

                                                        Вся эта питушня с контекстами только утомляет, как и разделение учётки на ГК с учётками реального мира.
                                                        Я привык универсально общаться и использовать либо минимум сленговых спецслов ("питушня", "полиморфизм"), либо минимум собеседников (не понимаешь "полиморфизм"? не общаюсь с непрограммистами!), а тут такая питушня.
                                                        Ответить
                                                      • - Пшел на ... !!! - взорвался Иван.
                                                        - Не волнуйтесь пожалуйста! - перевела его реплику на приличествующий
                                                        "Культуре" язык Ванесса. Сейчас ее фильтр эмоций работал по максимуму. Иван
                                                        у себя на кухне мог орать благим матом и бегать по потолку, но Ванесса от
                                                        его имени выразила бы разве что легкое недоумение. Это было удобно.
                                                        Ответить
                                          • Если он правда сменил пол, я извинюсь.
                                            Ответить
                                            • А, и главное перестанет слова «ня»-кать. То что у него(неё) ник PolinaAksenova - мне похуй.
                                              Ответить
                                              • Какой ультиматум )))
                                                Ответить
                                              • А что плохого в няканье? Вы носитель русского языка?

                                                Проблема может быть только если читатель не является носителем, и тогда все эти няки сильно зашумляют чтение, заставляют искать в словаре питушню, поскольку не-носитель не может интуитивно доказать отсутствие ня-слова в языке с достаточной точностью.
                                                Ответить
                                                • Когда лебедев не был еще пидарасом, а был просто унылым дизайнером, у него в жж пасся человек с белочкой на аватаре

                                                  Человек называл себя "пуфыстик" и писал о себе в третьем лице: пуфыстик вильнул пуфыстым хвосьтиком

                                                  Он так всех заебал, что был забанен
                                                  Ответить
                                                  • Может, он задолбал из-за того, что писал про хвостик там, где надо было писать по теме обсуждения?

                                                    Нятушканчики на ГК обычно някают по теме.
                                                    Ответить
                                                • Плохое то, что оно заебало
                                                  Ответить
                                              • > него(неё)
                                                Какие проносы )))
                                                Ответить
                                  • >Это зависит от языка

                                    Я именно это и пытался сказать.

                                    У Файка немножечко парадокс блаба.

                                    Он очень очень джавист/сишарпист, и потому для него очевидно, что конструктор это часть класса

                                    А вот Десктоп писал на objc и swift, и потому для него очевидно другое
                                    Ответить
                                    • не стоит часть декларации называть интерфейсом. это две разные сути хоть и отвечают за одно и тоже.
                                      Ответить
                                      • >не стоит часть декларации называть интерфейсом.
                                        Почему?

                                        где почитать определение интерфейса?
                                        Ответить
                                        • Часть стоит, а часть не стоит

                                          Какой многочлен
                                          Ответить
                                  • > это метод, ничем от других методов объектя ня отличающийся.
                                    Кроме того, что это волшебный метод, использующий особые правила именования, чтобы его не заmanglilо.
                                    class foo:
                                        def __init__(self):
                                            print("init")
                                        
                                        def __huit(self):
                                            print("huit")
                                    
                                        def __huit2__(self):
                                            print("huit2")
                                            
                                    bar = foo()
                                    bar.__init__() # Магия!
                                    bar.__huit() # Нет магии
                                    bar.__huit2__() # Опять волшебство
                                    Ответить
            • а генерики ты забыл?
              Ответить
              • нет... еще руки не дошли.. и пока мозгов тоже не хватает
                Ответить
          • Кстати забавно что в шарпе есть констрейнт new(), подразумевающий наличие конструктора без параметров, но нет констрейнтов конструктора с параметрами. Но строго говоря это разумно, потому что на самом деле это не столько констрейнт конструктора, сколько его отсутствия.
            Ответить
            • шоп рефлексией срать какие-то датакласы?
              Ответить
              • Скорее чтобы системам было легче какие-то плагины создавать.
                Ответить
    • Поясняю почему мы не можем юзать конструктор в интерфейсе.... constructor это то что вызывается при инициализации обьекта. Интерфейс это не обьект - это "указатель на обьект". а что бы указать на обьект он уже должен существовать или null. А если обьект существует - то и constructor уже вызван. поэтому там конструктор не нужен.
      Ответить
      • Это ограничения конкретного языка программирования (точнее семейства языков, унаследованных логически от С++, а те в свою очередь, от симулы)
        В других языках (В ObjC в частности) такой проблемы нет.

        Ничто не мешает выделить память, заполнить её нулями, а затем инициализировать нужным методом.
        Ответить
        • откудава возьмётся указатель на метод-конструктор в интерфейсе когда он указывает на null?
          Ответить
          • В интерфейсе нет никаких указателей. Интерфейс это конструкция языка, позволяющая статически проверить наличие нужных методов в классе.

            1. Мы выделяем память
            2. Заполняем её нулями
            3. Берем на нее указатель, и вызываем метод ``init`` передавая туда указатель в качестве аргумента
            Ответить
            • где тут интерфейс?
              Ответить
              • Интерфейс нужен для статической проверки того, то у класса есть нужный конструткор.
                Я приводил пример псевдокода, в котором был указатель на класс, у которого вызывался метод

                В TS так не сделать, но это не значит, что ни в каком языке так не сделать
                Ответить
            • к чему привязан init? к типу(к класу)? или это статический метод получающий указатель на память? как идет адресация к методу init?
              Ответить
              • Да, привязан к типу. Вот например в питоне
                from abc import abstractmethod
                
                
                class MyInterface:
                    @abstractmethod
                    def __init__(self, spam):
                        pass
                
                
                class MyClass(MyInterface):
                    def __init__(self, spam): # это конструктор
                        pass
                
                
                def create_object(clz): 
                    clz(42)
                
                
                create_object(MyClass) # Я передаю сюда класс, в нем точно есть параметр у конструктора
                Ответить
                • это не интерфейс. это декларация класса ... тут нет доступа к MyInterface.
                  Ответить
                  • >это не интерфейс. это декларация класса .
                    Вот это интерфейс
                    >class MyInterface:

                    >тут нет доступа к MyInterface.

                    Что такое "доступ к MyInterface"?
                    MyInterface гарантирует наличие метода
                    Ответить
                    • class MyInterface - "MyInterface" не делает ее интерфейсом. это раз. Это класс с абстрактными методами. У интерфейса нет такого понятия как "@abstractmethod" т.к. он уже по сути абстракт
                      Ответить
                      • >Это класс с абстрактными методами.
                        В чем разница между pure abstract классом и интерфейсом?

                        Верно ли я понимаю, что в С++ интерфейсов нет?
                        Ответить
                        • Да, нету. В c++ интерфейсы косплеят через pure abstract.

                          З.Ы. У них обычно даже есть реализация деструктора, так что даже и не pure.
                          Ответить
                          • #define interface class
                            а теперь есть
                            Ответить
                            • Ты не в майкрософте работаешь, случайно?
                              Ответить
                              • Меня печалит, что понятие "интерфейс" у некоторых говнокодян прибито гвоздями к ключевому слову из языка "джава"

                                Кстати, а как сущствует Win32API: интерфейс там есть, а ключ слова в сишечке нету?
                                Ответить
                                • интерфейс — это всегда между двумя сутями. вот когда ты всунешь два пальца в розетку - и ты начнешь коммуницировать с электрической сетью на контрактной частоте. твоя рука и розетка будут сутью интерфейса. А вот когда тебе мама говорит не сувать пальци в розетку - это декларация и тоже контракт но не интерфейс т.к. нет взаимодействия - есть только декларация намерений
                                  Ответить
                    • класс тоже гарантирует наличие метода и от этого он не стал интерфейсом.
                      Ответить
                • public T create_object<T>() where T : MyClass, new()
                  {
                  return new T();
                  }

                  это код в с# ... никакого интерфейса нет... тупо декларация
                  Ответить
            • т.е. создавая тип класс вы не знаете какие там методы? и вам нужен еще супер конструкия для проверки какие там методы?
              Ответить
            • что вы описали это
              1) p = malloc(10)
              2) memset(p, 10);
              3) init(p);

              где тут интерфейс?
              Ответить
              • Это пример на "си", в нем нет интерфейсов
                Но ничего не мешает иметь язык, где статически компилятор проверяет, что можно передать в init.
                Ответить
    • - Слушай, а почему никто не знает происхождения твоей клички, а? Это же только идиот не догадается, когда увидит.
      Ответить

    Добавить комментарий