- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 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.08.2021 17:07 # 0
ASD_77 01.08.2021 17:07 # 0
PayToiletsGovno 01.08.2021 17:17 # 0
ASD_77 01.08.2021 17:57 # 0
j123123 01.08.2021 23:42 # −1
Можно ведь просто создавать структуры, а потом создавать функции, которые что-то с такими-то структурами делают.
j123123 01.08.2021 23:47 # 0
HEu3BECTHblu_nemyx 02.08.2021 01:12 # +1
Да, если бы были компайлтайм-функции, которые могли бы делать что-то с типами, дополнительные сущности были бы не нужны.
guest6 01.08.2021 23:48 # +3
Desktop 03.08.2021 11:43 # 0
rotoec
rotoec++
1024-- 03.08.2021 11:45 # +2
Desktop 03.08.2021 12:36 # +1
ASD_77 02.08.2021 01:48 # +3
JaneBurt 03.08.2021 10:41 # +1
bormand 03.08.2021 11:00 # 0
Так что вместо "частичного наследования" я бы просто предложила что-то удобное для делегирования группы методов какому-нибудь полю. Типа мы пишем, что вся реализация IFoo в нашем классе отправляется в поле m_foo. Ну или поштучно, если надо детальнее.
Desktop 03.08.2021 11:47 # 0
в objc-шных протоколах (не путать с pure swift протоколами) есть @optional методы, которые можно не реализовывать.
в сишарпе никакого @optional нет, потому в ксамарине всякие табличные делегаты приходится наследовать от (абстрактного?) класса, а не от интерфейса (потому что вместо @optional в классе пустые реализации, бросающие весёлые эксепшоны типа "you should not call this method in base")
и наследник UIViewController нихуя уже не может быть делегатом собственного UITableView, потому что множественного наследования в шарпе тоже нет
получается вербозненько, зато с разделением по ответственности
bormand 03.08.2021 11:58 # 0
Desktop 03.08.2021 12:36 # 0
ASD_77 03.08.2021 13:05 # +1
ASD_77 03.08.2021 17:43 # +1
guest6 03.08.2021 19:52 # 0
Kozel 03.08.2021 14:27 # 0
Русту с его orphan rule точно бы не навредило.
Кстати, я бы ещё подумал на тему явного экспорта/импорта реализации стороннего трейта над сторонним типом. Или они уже подумали?
А ещё можно бы было позволить реализовывать сторонний трейт над сторонним типом, не выпуская реализацию за пределы модуля/пакета/чего-нибудь-ещё, чтобы не конфликтовало. И при появлении "официальной" реализации предпочитать локальную и выдавать предупреждение.
Hacpy 03.08.2021 14:41 # 0
Desktop 03.08.2021 11:42 # 0
ASD_77 03.08.2021 13:06 # 0
Desktop 03.08.2021 13:07 # 0
затем, чтобы это было в контракте, не?
ASD_77 03.08.2021 17:42 # 0
Desktop 03.08.2021 17:45 # 0
- што
Fike 03.08.2021 18:19 # +1
конструктор в интерфейсе это де-факто сторонний интерфейс фабрики, которая связана с описываемым типом исключительно типом возвращаемого объекта
Desktop 03.08.2021 19:23 # 0
bormand 03.08.2021 19:25 # 0
Desktop 03.08.2021 19:28 # 0
bormand 03.08.2021 19:32 # 0
Там же в две фазы объект создаётся -- сначала память выделяешь (alloc), потом зовёшь на ней конструктор (init). Поэтому это не столько конструктор, сколько метод инициализации.
Какие сишные корни )))
Desktop 03.08.2021 19:44 # +1
guest6 03.08.2021 19:35 # 0
Псевдокот:
bormand 03.08.2021 19:36 # 0
Ну собственно в objc сначала фабричный alloc() у класса, а потом инициализатор init() у объекта.
guest6 03.08.2021 19:37 # 0
У всех классов IPtitsa обязан быть конструктор с аргументом "koko (тип сам выдумай:)), вот мой код не знает с каким именно классом он имеет дело
bormand 03.08.2021 19:39 # 0
guest6 03.08.2021 19:41 # 0
Он только знает, что у него есть мтеод newInstance (он у всех классов есть в моем псевдокоте), но конкретная сигнатура задана интерфейсом
Хочешь -- называй это фабричным методом
bormand 03.08.2021 19:43 # 0
Но newInstance() то не у тех объектов, которые ты создаёшь. Он у фабричных объектов (или инстансов класса класса, или чего там ещё).
guest6 03.08.2021 19:46 # 0
Фабрика обычно создает семейство объектов (например фабрика для создания виджетов)
Во-вторых в java/c++/c# тебе всё равно придется иметь И конструктор И такой вот метод, который подготавливает данные, и вызывает конструктор (причем его еще приватным придется делать, чтобы там снаружи не дергали наверное)
А в моем псевдокоте нет
> Но newInstance() то не у тех объектов, которые ты создаёшь. Он у фабричных объектов (
Почему?
А конструктор у кого: у класса, или у объекта?
bormand 03.08.2021 19:41 # 0
guest6 03.08.2021 19:43 # 0
Чем он такой особенный? Почему нельзя представить его как malloc+init (как собссно и сделано в Objc, как ты верно и сказал)
Только тем, что в C++ он слит воедино во имя RAII?
bormand 03.08.2021 19:45 # 0
Ладно ок, пусть будет конструктором. В конце-концов в объектном паскале так же было.
guest6 03.08.2021 19:49 # 0
Тогда вполне логично его выразить в интерфейсе.
Desktop 03.08.2021 19:54 # 0
в свифте конструктор это спецметод в отличие от обжси
но он точно так же может быть представлен в интерфейсе
имхо это удобно, недавно хотел попользоваться в пет-проекте и соснул, потому что в шарпе этого нет
guest6 03.08.2021 19:56 # 0
Desktop 03.08.2021 19:58 # 0
я хочу иметь generic метод, который будет внутри создавать такой элемент. это необязательно должна быть фабрика, он может элемент и не возвращать, а дальше куда-то передавать
вот внутри этого метода я и буду звать такой конструктор
guest6 03.08.2021 20:46 # 0
CoronavirusGovno 03.08.2021 19:53 # 0
Итого три фазы:
1. Молока. Хотя её можно отнести не к конструктору, а к «new».
2, Заполнение VMT.
3. Твой код (что могло бы быть выражено обычным методом).
guest6 03.08.2021 20:48 # +1
VMT в каком-то смысле тоже часть выделения памяти и заполнения её нужными рантайму структурами
bormand 03.08.2021 21:18 # 0
guest6 03.08.2021 21:22 # 0
bormand 03.08.2021 21:23 # 0
guest6 03.08.2021 21:27 # 0
Я не обязан это знать.
А так вполне можно сделать язык Хуй++, где "конструктор" будет только выделять память и заполнять VMT оставляя неиинициализированной память, а потом ты будешь руками вызывать ``init``
bormand 03.08.2021 21:35 # 0
Впрочем, это и так говнокод.
guest6 03.08.2021 21:37 # 0
А кстати что будет, если в конструкторе родителя вызвать виртуальный метод, который переопределен у потомка? Кроме говнокода что будет?
bormand 03.08.2021 22:16 # 0
Есть ненулевой шанс совершить сеппуку через pure virtual call, а в остальном всё норм.
guest6 03.08.2021 22:19 # 0
У меня тупак, я забыл как это в жабе
Скорее всего либо так же, либо у тебя уже есть потомок, но у него все поля по нолям.
Но вообще это лютый говнокод, хорошо чот так нельзя
bormand 03.08.2021 22:59 # 0
DypHuu_niBEHb 03.08.2021 23:00 # 0
Попробуй сделать ему "final int" поле и в конскторе прописать туда "42", а из виртуального метода обратиться
там будет 0?
bormand 03.08.2021 23:02 # 0
guest6 03.08.2021 23:04 # 0
В крестах всё могло быть хуже, допусти они такое поведение, но в джаве "не инициализированной памяти" не бывает
LORGovno 03.08.2021 23:07 # 0
guest6 03.08.2021 23:09 # 0
Сегфол можно получить дёрнув нативный код, напимер через JNA. Я так делал, и совсем не специально:)
bormand 03.08.2021 23:10 # 0
Без unsafe и нативных функций -- маловероятно.
Но поверхность атаки у JRE огромная, не удивлюсь, если какие-то изкоробочные либы крашатся в нативном коде при каких-то условиях. Побег из песочницы ведь был уже (собственно после него джаву и похоронили).
guest6 03.08.2021 23:08 # 0
1024-- 04.08.2021 14:30 # 0
А для тех, кто хочет пострелять в ногу - сделать синтаксис в виде
Иерархию константных методов же компилятор умеет проверять.
bormand 04.08.2021 14:33 # 0
Fike 03.08.2021 21:33 # 0
никто не говорит что нельзя, говорят что не надо это
guest6 03.08.2021 21:35 # 0
Просто опытный евангелист умеет доказать что жопаебля это вовсе не жопаебла.
Как там в "драконе" у Шварца:
"Почему два, в сущности, больше, чем три"
CoronavirusGovno 03.08.2021 21:52 # 0
Desktop 03.08.2021 22:16 # 0
guest6 03.08.2021 22:18 # 0
Если мне не надо, то значит никому не надо
Fike 03.08.2021 22:26 # 0
Desktop 03.08.2021 22:28 # 0
Fike 03.08.2021 22:29 # 0
guest6 03.08.2021 22:31 # 0
Совершенно не очевидно, чому так
> Точно так же, как и статические методы
В конкретных языках, угу. Но не везде так.
Вот бы сейчас представления из джав и шарпов выдавать за универсальные истины.
Fike 03.08.2021 23:11 # 0
Потому что интерфейса объекта описывает взаимодействие с объектом, не с типом объекта.
DypHuu_niBEHb 03.08.2021 23:15 # 0
Он переводит объект из одного состояния в другое.
Чем отличается (псевдокот)
Fike 03.08.2021 23:18 # 0
Конструктор это функционал типа, не объекта.
DypHuu_niBEHb 03.08.2021 23:19 # 0
>Конструктор это функционал типа,
Почему? Разве он работает с типом?
Нет
Он работает с объектом
Освободи свои мысли от наследкников симулы, юный падаван
Закрой глаза, и представь, что нет ни C++, ни Java с C#, а есть только посылка сообщения объекту "инициализируйся"
Fike 03.08.2021 23:20 # 0
guest6 03.08.2021 23:21 # 0
Конструтор не трогает поля класса, он исполняется на объекте, когда память уже выделена, и основной аргумент его это "this" а не класс
Fike 03.08.2021 23:30 # 0
> он исполняется на объекте
В контексте объекта, при чем если уж мы пошли сюда, то большинство языков имеют ограничения по функционалу в конструкторе, которые не дают его присовокупить к остальным методам.
Fike 05.08.2021 21:10 # 0
PolinaAksenova 03.08.2021 23:22 # −2
PolinaAksenova 03.08.2021 23:24 # −2
guest6 03.08.2021 23:33 # 0
ru66oH4uk 04.08.2021 01:16 # +2
Это же тот же самый гост, пусть даже он увлёкся аниме, и стал Полиной
guest6 04.08.2021 09:46 # +1
guest6 04.08.2021 10:07 # +1
bormand 04.08.2021 11:14 # +1
А чего добился ты, анонимный вахтёр?
guest6 04.08.2021 11:32 # 0
bormand 04.08.2021 11:35 # +1
А почему ты их боишься? Есть какое-то рациональное объяснение? Или это какая-то подсознательная проблема.
guest6 04.08.2021 11:42 # 0
Гомофобия - Ряд негативных установок и чувств по отношению к гомосексуальности или людям, которые идентифицируются или воспринимаются как ЛГБТ+. Термин «гомофобия» употребляется в европейских официальных документах, где в некоторых случаях это явление ставится в один ряд с расизмом, ксенофобией, антисемитизмом и сексизмом. Термин «гомофобия» часто критикуется из-за того, что не является полностью подходящим, так как гомофобия не является фобией в клиническом смысле.
https://ru.wikipedia.org/wiki/Гомофобия
Soul_re@ver 04.08.2021 11:52 # +3
guest6 04.08.2021 11:59 # +1
Desktop 04.08.2021 12:51 # +3
– удобно, можно сразу и яичницу пожарить
DypHuu_niBEHb 04.08.2021 14:51 # +1
родился в лесу,
а потом много лет
Пропадал-прозябал в огороде.
Только в прошлом году,
ни к селу, на беду
Полюбил я Володю.
Так имело ли смысл
целоваться в кино,
Загорать и питаться порою умеренно мясом,
Чтобы стать пидорасом?
Шесть с половиной процентов зверей,
Семь процентов людей
И иных представителей
Человеческой расы -
Пидорасы...
bormand 04.08.2021 17:41 # +1
А вообще, тебе не помешало бы извиниться.
ГК, конечно, всегда славился прямотой высказываний и жёстким троллингом... но тут ты палку явно перегнул.
DypHuu_niBEHb 04.08.2021 17:43 # 0
А когда мы пишем "сишкобляди соснули" или "поссал на прыщеблядь" ты тоже обижаешься?
guest6 04.08.2021 18:05 # 0
j123123 04.08.2021 18:08 # 0
А борманда тоже перестал уважать после того, как она о себе в женском роде писать начала?
bormand 04.08.2021 18:18 # +2
Soul_re@ver 04.08.2021 18:20 # +4
Я няпример могла поддерживать несколько диалогов разными персоняжами разного пола. Когда я общалась с другим персоняжем, который своими репликами подтверждал мою принядлежность к женскому полу, убедить в этом посторонних няблюдателей было проще. Потом я пользовалась белорыцарством большинства пользователей ММОРПГ и получала от них профит.
DypHuu_niBEHb 04.08.2021 18:22 # +1
1024-- 04.08.2021 18:29 # 0
А вот uwu owo меня бесит как Faux Cyrillic кириллицечитающих. Я эту питушню читаю как "уву" и "ово", а смайловое значение этих слов так и не гуглил, поскольку не так часто эта питушня встречается и не так много смысла добовляет.
bormand 04.08.2021 18:24 # 0
Какой мультитаскинг )))
Линейка поди?
guest6 04.08.2021 18:28 # 0
Недавно как раз думал: а на какой интфрейс в мультихоум хосте пойдет бродкаст, если я серану на 255.255.255.255 включив у сокета ``SO_BROADCAST``
Угадаешь?
bormand 04.08.2021 18:29 # 0
DypHuu_niBEHb 04.08.2021 18:33 # 0
Правильное* решение это выбрать интерфейс через ``SO_BINDTODEVICE``
*насколько вообще бродкаст можно называть "правильным" решением
1024-- 04.08.2021 18:25 # +1
bormand 04.08.2021 18:34 # +3
Да ну, всё равно ведь несколько социальных контекстов умеешь поддерживать. Я вот, к примеру, не матерюсь если контекст этого не подразумевает и не пишу "прыщи" вместо "линукса" на работе. Точня так же и с няканьем.
Главное, чтобы были какие-то явные и чёткие индикаторы какой контекст сейчас активен.
DypHuu_niBEHb 04.08.2021 18:35 # +2
а я давеча чуть было не
1024-- 04.08.2021 18:43 # +2
Вся эта питушня с контекстами только утомляет, как и разделение учётки на ГК с учётками реального мира.
Я привык универсально общаться и использовать либо минимум сленговых спецслов ("питушня", "полиморфизм"), либо минимум собеседников (не понимаешь "полиморфизм"? не общаюсь с непрограммистами!), а тут такая питушня.
CHayT 04.08.2021 19:42 # +1
- Не волнуйтесь пожалуйста! - перевела его реплику на приличествующий
"Культуре" язык Ванесса. Сейчас ее фильтр эмоций работал по максимуму. Иван
у себя на кухне мог орать благим матом и бегать по потолку, но Ванесса от
его имени выразила бы разве что легкое недоумение. Это было удобно.
guest6 04.08.2021 17:45 # 0
guest6 04.08.2021 18:03 # +1
bormand 04.08.2021 18:07 # +2
1024-- 04.08.2021 18:23 # 0
Проблема может быть только если читатель не является носителем, и тогда все эти няки сильно зашумляют чтение, заставляют искать в словаре питушню, поскольку не-носитель не может интуитивно доказать отсутствие ня-слова в языке с достаточной точностью.
DypHuu_niBEHb 04.08.2021 18:25 # +1
Человек называл себя "пуфыстик" и писал о себе в третьем лице: пуфыстик вильнул пуфыстым хвосьтиком
Он так всех заебал, что был забанен
1024-- 04.08.2021 18:32 # +1
Нятушканчики на ГК обычно някают по теме.
Desktop 04.08.2021 19:46 # 0
Hacpy 04.08.2021 18:29 # +1
Какие проносы )))
ru66oH4uk 04.08.2021 01:15 # +2
Я именно это и пытался сказать.
У Файка немножечко парадокс блаба.
Он очень очень джавист/сишарпист, и потому для него очевидно, что конструктор это часть класса
А вот Десктоп писал на objc и swift, и потому для него очевидно другое
ASD_77 04.08.2021 13:55 # 0
DypHuu_niBEHb 04.08.2021 14:50 # +1
Почему?
где почитать определение интерфейса?
Desktop 04.08.2021 19:51 # 0
Какой многочлен
Soul_re@ver 05.08.2021 21:24 # 0
Кроме того, что это волшебный метод, использующий особые правила именования, чтобы его не заmanglilо.
Desktop 03.08.2021 17:47 # 0
ASD_77 03.08.2021 18:29 # 0
Fike 03.08.2021 21:35 # 0
guest6 03.08.2021 21:40 # 0
Fike 03.08.2021 21:55 # 0
guest6 03.08.2021 21:56 # 0
ASD_77 04.08.2021 02:19 # +1
ru66oH4uk 04.08.2021 02:24 # 0
В других языках (В ObjC в частности) такой проблемы нет.
Ничто не мешает выделить память, заполнить её нулями, а затем инициализировать нужным методом.
ASD_77 04.08.2021 02:39 # 0
guest6 04.08.2021 02:44 # +1
1. Мы выделяем память
2. Заполняем её нулями
3. Берем на нее указатель, и вызываем метод ``init`` передавая туда указатель в качестве аргумента
ASD_77 04.08.2021 02:47 # 0
ru66oH4uk 04.08.2021 02:51 # 0
Я приводил пример псевдокода, в котором был указатель на класс, у которого вызывался метод
В TS так не сделать, но это не значит, что ни в каком языке так не сделать
ASD_77 04.08.2021 02:49 # 0
ru66oH4uk 04.08.2021 02:56 # 0
ASD_77 04.08.2021 03:32 # 0
DypHuu_niBEHb 04.08.2021 15:11 # 0
Вот это интерфейс
>class MyInterface:
>тут нет доступа к MyInterface.
Что такое "доступ к MyInterface"?
MyInterface гарантирует наличие метода
ASD_77 04.08.2021 17:52 # 0
DypHuu_niBEHb 04.08.2021 17:53 # 0
В чем разница между pure abstract классом и интерфейсом?
Верно ли я понимаю, что в С++ интерфейсов нет?
bormand 04.08.2021 17:54 # 0
З.Ы. У них обычно даже есть реализация деструктора, так что даже и не pure.
DypHuu_niBEHb 04.08.2021 17:55 # 0
а теперь есть
bormand 04.08.2021 17:56 # +1
DypHuu_niBEHb 04.08.2021 17:57 # +2
Кстати, а как сущствует Win32API: интерфейс там есть, а ключ слова в сишечке нету?
ASD_77 04.08.2021 18:58 # +1
ASD_77 04.08.2021 17:52 # 0
ASD_77 04.08.2021 03:54 # 0
{
return new T();
}
это код в с# ... никакого интерфейса нет... тупо декларация
ASD_77 04.08.2021 02:50 # 0
ASD_77 04.08.2021 02:52 # 0
1) p = malloc(10)
2) memset(p, 10);
3) init(p);
где тут интерфейс?
guest6 04.08.2021 02:58 # 0
Но ничего не мешает иметь язык, где статически компилятор проверяет, что можно передать в init.
ASD_77 04.08.2021 03:21 # 0
DypHuu_niBEHb 04.08.2021 15:10 # 0
3EHuTHblu_nemyx 05.08.2021 21:25 # 0
passiv 25.08.2021 19:31 # 0