ЙажаСценарий / Говнокод #27543 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 ASD_77, (Updated )

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

  • и результат работы

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

      Можно ведь просто создавать структуры, а потом создавать функции, которые что-то с такими-то структурами делают.
      Ответить
        • Интерфейс — это контракт, узелок на память, что нужно реализовать.

          Да, если бы были компайлтайм-функции, которые могли бы делать что-то с типами, дополнительные сущности были бы не нужны.
          Ответить
      • это решает проблему унифицированного доступа для разных типов. и поля это один из обьектов унификации 🙂
        Ответить
  • В 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 точно бы не навредило.
        Кстати, я бы ещё подумал на тему явного экспорта/импорта реализации стороннего трейта над сторонним типом. Или они уже подумали?
        А ещё можно бы было позволить реализовывать сторонний трейт над сторонним типом, не выпуская реализацию за пределы модуля/пакета/чего-нибудь-ещё, чтобы не конфликтовало. И при появлении "официальной" реализации предпочитать локальную и выдавать предупреждение.
        Ответить
  • а я пропустил, конструкторы в интерфейсе можно описывать?
    Ответить
      • странный вопрос

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

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

              конструктор в интерфейсе это де-факто сторонний интерфейс фабрики, которая связана с описываемым типом исключительно типом возвращаемого объекта
              Ответить
              • у нас в свифте можно указать конструкторы в протоколе и никто не придумывает такие путаные объяснения, почему это нельзя
                Ответить
                • Ну не то что нельзя... Просто странно у всех реализаций иметь одинаковый конструктор, выглядит как какой-то маргинальный кейс.
                  Ответить
                  • почему? объекты, которые создаются из 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# в жопу ебутся в значительно бОльшей степени.

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

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

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

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

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

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

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

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

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

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

                            Чем отличается (псевдокот)
                            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``

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

                                                        Правильное* решение это выбрать интерфейс через ``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.
                        Ответить
                            • Меня печалит, что понятие "интерфейс" у некоторых говнокодян прибито гвоздями к ключевому слову из языка "джава"

                              Кстати, а как сущствует 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.
              Ответить
  • - Слушай, а почему никто не знает происхождения твоей клички, а? Это же только идиот не догадается, когда увидит.
    Ответить

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

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8