|
83 / 1 / 0
Регистрация: 08.11.2017
Сообщений: 146
|
|||||||||||
Какой это шаблон проектирования, и можно ли сделать в C# также (как в С++)?08.11.2017, 00:33. Показов 2628. Ответов 21
Метки нет (Все метки)
Добрый день.
Когда я сталкивался ранее с наследованием классов и полиморфизмом, то это было или, 1) дописывание каких то новых методов в класс-потомок, которых не было в классе-предка. (обычное наследование). 2) переопределение некоторых методов, объявленных в базовом классе как virtual, (обычный полиморфизм), причем сигнатурна методов оставалась одинаковой. А можно ли унаследовать сразу множество связанных классов? Т.е. как бы целый проект из связных классов, унаследуется от базового проекта, тех же классов, каждый в своем множестве унаследован от класса-прототипа в базовом проекте? упростим задачу до предела — множество из 2-х классов, должно унаследоваться от другого множества из 2-х классов. Допустим, это будут классы SpecialEntity унаследованный от ModuleEntity (1-й уровень), и SpecialAlgorithmic от ModuleAlgorithmic, (2-й уровень). Получается, чтобы так сделать, нам нужно унаследовать некий класс SpecialAlgorithmic от ModuleAlgorithmic, да так, чтобы 1) его поля объявленные как ModuleEntity entity; просто стали полями унаследуемого типа, SpecialEntity entity; 2) Методы, к примеру, назовем, AlgorithmOfModule — нужно переопределить (override), да так, что его сигнатура "почти такая же", но не совсем — этот метод должен уже принимать унаследуемые ссылки на SpecialEntity вместо ModuleEntity. Т.е. на псевдо-языке, получится что то типа такого --
Тогда получается, в вызывающем коде, работа с производным проектом, будет практически такой же, как и работа с базовым проектом (нужно будет только заменить 'Module' на 'Special'), что значительно упрощает разработку проектов, которые будут развиваться из некоего шаблонного проекта. Долго думая, на C++ мне удалось реализовать данный шаблон проектирования. Получилось так -
я изобретаю велосипед, или этот шаблон проектирования реально существует, и имеет какое то название? И еще интересно - можно ли подобное реализовать на C# ? Спасибо.
0
|
|||||||||||
| 08.11.2017, 00:33 | |
|
Ответы с готовыми решениями:
21
Шаблон проектирования Prototype. Можно ли по такой реализации сказать, что используется этот шаблон? Можно ли применить шаблон проектирования? Можно ли в данном случае использовать шаблон проектирования Bridge |
|
14139 / 9368 / 1350
Регистрация: 21.01.2016
Сообщений: 35,267
|
|
| 08.11.2017, 06:58 | |
|
SergeyYN, довольно сложно распарсить эту портянку потока сознания.
В C# нет множественного наследования, у класса может быть только один класс-предок. Всё содержимое предка наследуется как есть (включая приватное барахло, к которому нет доступа) и класс-потомок воспринимается внешним кодом как базовый, если работа с ним идёт через ссылку на базовый тип. Переопределять можно только методы с той же сигнатурой. Добавить аргументов переопределённому методу нельзя, это уже будет тупо другой метод (перегрузка).
0
|
|
|
83 / 1 / 0
Регистрация: 08.11.2017
Сообщений: 146
|
||||||
| 08.11.2017, 08:03 [ТС] | ||||||
|
довольно сложно распарсить
Хорошо - вот проще. Есть некий код, используется N классов. В примере ниже - только 2 класса.
так, чтобы в вызывающем коде, всё что нужно было сделать - это 'Module' на 'Special' везде - позаменять, и должно работать. В частности, метод AlgorithmOfModule - будет иметь не совсем такую же сигнатуру, а сигнатуру, в которой класс-предок заменен классом потомком. (и поля внутри класса аналогично). Также, AlgorithmOfModule может быть как виртуальным (полностью переписанным в классе-потомке), так и обычным методом, часть кода которого - можно вызвать из объекта предка. SpecialEntity param = new SpecialEntity( /* ... */ ); SpecialEntity modEnt = new SpecialEntity( /* параметры создающие объект */ ); SpecialAlgorithmic modAlg = new SpecialAlgorithmic(modEnt); SpecialEntity[] result = modAlg.AlgorithmOfModule(param); Надеюсь, так понятнее. Можно это сделать на C# ? Ну вот, на C++ вышло, что это сделать можно. (выше я подробно это и расписал), И здесь не "множественное наследование". "Многоклассовое" - этот термин я сам придумал. (точнее - наследование путем Ковариантности + обычное в генерик-классах). Получается такой шаблон проектирования, в котором, N связных классов в одном проекте - наследуется сразу N связными классами в другом проекте.
0
|
||||||
|
14139 / 9368 / 1350
Регистрация: 21.01.2016
Сообщений: 35,267
|
|
| 08.11.2017, 08:08 | |
|
SergeyYN, ну, тут либо обобщённые базовые классы, либо
SpecialAlgorithmic должен работать с SpecialEntity через его базовый класс ModuleEntity и тогда сигнатура метода и все поля класса не изменятся.
1
|
|
|
83 / 1 / 0
Регистрация: 08.11.2017
Сообщений: 146
|
|||
| 08.11.2017, 08:17 [ТС] | |||
|
и возвращаемый объект. См. метод MethodGet - в объекте SpecialDrive, там же проваливаемся в "Точка3" "Точка2" "Точка1" . А "Точка1" - часть кода выполнялось в методе MethodGet - объекта ModuleDrive. сигнатура метода MethodGet в классе SpecialDrive вот такая - SpecialPosition MethodGet(SpecialPosition element) а сИгнатура метода MethodGet в классе ModuleDrive вот такая - ModulePosition MethodGet(ModulePosition element) тем не менее, метод MethodGet самый что ни есть "переопределенный", т.к. SpecialDrive унаследован от ModuleDrive. Если его определить как virtual, то вызовется версия в зависимости от типа ранее созданного объекта.
0
|
|||
|
14139 / 9368 / 1350
Регистрация: 21.01.2016
Сообщений: 35,267
|
||
| 08.11.2017, 08:22 | ||
|
0
|
||
|
83 / 1 / 0
Регистрация: 08.11.2017
Сообщений: 146
|
|||||||||
| 08.11.2017, 08:40 [ТС] | |||||||||
и сигнатура у него отличается. ModuleEntity , ModuleAlgorithmic , ModulePosition , ModuleController. Каждый следующий класс - использует предыдущий, т.е. ModuleAlgorithmic использует ModuleEntity , а не наоборот. Пишем производный проект, у нас будут 4 унаследованных класса SpecialEntity , SpecialAlgorithmic , SpecialPosition , SpecialController. аналогично, каждый следующий класс - использует предыдущий, т.е. SpecialAlgorithmic использует SpecialEntity , а не наоборот. Добиться на C++ как выше было видно, можно путем 1) создания классов-шаблонов, 2) правильного использования typedef, 3) правильного наследования от класса-шаблона. Добавлено через 3 минуты Но наследование там тоже было - в моём примере - ModuleDrive -> TemplateDrive<SpecialPosition> -> SpecialDrive класс справа - унаследован от класса слева. Таким образом SpecialDrive неявно унаследован от ModuleDrive . Через ковариантность, и только позже - через обычное наследование. Если подобное реализовать на C#, то (SpecialDrive is ModuleDrive ) - должно выдать true. В внутри они используют разные типы объектов, первый - SpecialPosition, а второй - ModulePosition. В полях и сигнатурах своих методов.
0
|
|||||||||
|
14139 / 9368 / 1350
Регистрация: 21.01.2016
Сообщений: 35,267
|
|||||||
| 08.11.2017, 17:20 | |||||||
|
А такое вас сильно удивит?
0
|
|||||||
|
83 / 1 / 0
Регистрация: 08.11.2017
Сообщений: 146
|
|||
| 08.11.2017, 19:07 [ТС] | |||
|
2) можно ли подобное сделать на C# то что описано в C++ коде ? То, что я описал - не видел чтобы кто то использовал в проектах. Даже название шаблона проектирования не найти, с похожим описанием. Генерик классы + наследование + typedef, + двухшаговое наследование - Ковариантность + обычное в генерик-классах. Всё для того, чтобы в конечном итоге в вызывающем коде, можно было сразу целое множество классов заменить, т.е. просто приставку 'Module' на 'Special' заменить, и тем самым получить, схожий код при работе с разными проектами.
0
|
|||
|
14139 / 9368 / 1350
Регистрация: 21.01.2016
Сообщений: 35,267
|
||||
| 08.11.2017, 19:35 | ||||
|
0
|
||||
|
83 / 1 / 0
Регистрация: 08.11.2017
Сообщений: 146
|
|||||||||
| 08.11.2017, 19:44 [ТС] | |||||||||
|
Так тут не просто "заменяете класс унаследованным от него." Тут целый проект, из связных
N-классов унаследован от другого проекта с N класами. шаблон проектирования.
Т.е. автоматически меняются и сигнатуры методов внутри классов, и типы полей, и типы в коде! Без generic + typedef в приведенном случае вроде, не обойтись. и имея код, его использующий, Разрабатываем другой проект, тоже с N классами, (Special), и любые другие проекты. ВЕСЬ КОД который использует N классов, будет точно таким же, за исключением замены приставки. 'Module' - на 'Special'. Кроме удобства восприятия, есть и другие более интересные возможности. Например, имея код, распарсить его, заменить приставку в словах в автогенераторе кода, и запустить для другого проекта. И не надо вникать, где там нужно через базовый класс ModuleEntity обращаться, а где надо напрямую использовать SpecialEntity, и т.п. нюансы. Но главное - эстетическая красота подобного решения.
0
|
|||||||||
|
14139 / 9368 / 1350
Регистрация: 21.01.2016
Сообщений: 35,267
|
|||||
| 08.11.2017, 19:50 | |||||
|
0
|
|||||
|
83 / 1 / 0
Регистрация: 08.11.2017
Сообщений: 146
|
|||
| 08.11.2017, 20:19 [ТС] | |||
|
а в унаследуемом SpecialDrive - тоже, то всё отлично работает. Т.е. для объекта типа SpecialDrive - вызовется свой метод, а для ModuleDrive - свой. Причем сигнатуры у них действительно разные. Проверял под дебаггером. Не знаю правда, прокатит ли что то подобное в C#. ModuleClass1, используется в ModuleClass2, этот используется в ModuleClass3, а этот в ModuleClass4. т.е. ModuleClass1 ModuleClass2 (принимает ModuleClass1) ModuleClass3 (принимает ModuleClass2) ModuleClass4 (принимает ModuleClass3 ModuleClass2) Наследую целый проект. 4 класса будут такими - SpecialClass1, используется в SpecialClass2, этот используется в SpecialClass3, а этот в SpecialClass4. в определении методов - писать везде Module вместо Special в сигнатурах ? т.е. я хотел SpecialClass1 SpecialClass2 (принимает и использует SpecialClass1) SpecialClass3 (принимает и использует SpecialClass2) SpecialClass4 (принимает и использует SpecialClass3 SpecialClass2) а вы предлагаете, SpecialClass1 SpecialClass2 (принимает и использует ModuleClass1) SpecialClass3 (принимает и использует ModuleClass2) SpecialClass4 (принимает и использует ModuleClass3 ModuleClass2) а потом делать явное преобразование внутри? При обращении к полям, в вызываемом коде - писать Special.. ? Т.е. надо разбираться где использовать одно слово, а где другое слово. По сути то, что я пишу, это лучше называть не наследование классов. Это наследование целых проектов. Какие возможности новые могут быть, если нам не надо вникать, а можно просто заменить во всём коде слова. Допустим, я разработал некий проект, который назвал "SpecialProject", с классами, которые касаются проекта, все начинаются с Special... (SpecialDrive, SpecialController, SpecialAlgorithmic и т.д. ) и dll этого проекта отдал другому производителю. Производитель, используя мой dll, написал некую другую программу (у него на выходе будет exe файл), которая использует этот dll. Затем я разработал допустим, другой проект, который назвал "OtherProject", с классами, которые касаются проекта, все начинаются с Other... (OtherDrive, OtherController, OtherAlgorithmic и т.д. ) они унаследованы от прототипов классов первого проекта. Тогда я могу дать новую dll производителю, и не требовать его код (да он может и не хотеть его отдавать), для того чтобы переделать, а сказать типа "замени в своем проекте все 'Special' на 'Other' " - и всё заработает. Или и вовсе, дать ему программу, которая удаленно рефлектором вынимет его код, автогенератором заменив 'Special' на 'Other' - на новый, автобилдом - сделает ребилд, и у него готовый проект, который обращается к т.н. "унаследованному проекту". А может даже, и ребилд проекта не потребуется, если в своей dll заменить старый SpecialProject на ModuleProject, а OtherProject на SpecialProject . Ну, это только одна из возможностей, реально же, больше всего именно красота решения нравится.
0
|
|||
|
burning1ife
|
||
| 09.11.2017, 00:48 | ||
Сообщение было отмечено SergeyYN как решение
Решение
Для всего этого и придумали интерфейсы и IoC (Dependency Injection)
Прочитайте про принципы SOLID. Те, которые на мой взгляд не соблюдены в данной реализации: 1. Принцип открытости/закрытости (Open-closed) - программные сущности должны быть открыты для расширения, но закрыты для модификации. 2. Принцип подстановки Барбары Лисков (Liskov substitution) Вы при изменении сигнатуры вы усиливаете предусловия. 3. Принцип инверсии зависимостей (Dependency Invertion) Зависимости внутри системы строятся на основе абстракций. Модули верхнего уровня не зависят от модулей нижнего уровня. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций У вас классы зависят от других классов, а не от абстракций. Добавлено через 17 минут Тот же MEF и ему подобные. Добавлено через 10 минут Мне кажется, что ваша задача может решаться также с помощью Generic interface
1
|
||
|
83 / 1 / 0
Регистрация: 08.11.2017
Сообщений: 146
|
|
| 09.11.2017, 02:51 [ТС] | |
|
kenny69, большое спасибо!
Сразу несколько направлений (я про них раньше не читал, интересно будет изучить), и намного понятнее, в какую сторону смотреть. А то бывает иногда, приходится что то принципиально новое разработать, а глубокое проектирование в самом начальном этапе - самое важное (т.е. позже переделывать - будет намного труднее).
0
|
|
|
14139 / 9368 / 1350
Регистрация: 21.01.2016
Сообщений: 35,267
|
||||||||
| 09.11.2017, 06:37 | ||||||||
|
Вы принимаете в своих классам аргрументы оперделённого, базового класса и не должны знать, что там на самом деле. Такой код получается расширяемым. Кликните здесь для просмотра всего текста
0
|
||||||||
|
83 / 1 / 0
Регистрация: 08.11.2017
Сообщений: 146
|
|||||||||||||||||||||||||||
| 09.11.2017, 16:28 [ТС] | |||||||||||||||||||||||||||
|
У вас два класса базовые, это ваш класс A (назовем его SpecialClass1), и ваш класс Original (назовем его SpecialClass2). Пусть они заключены в проект с названием SpecialProject. Его допустим, скомпилировали в dll. SpecialProject.dll : код определяющий <связное множество SpecialClass1, SpecialClass2, Special... >
Затем был написан внешний код, его использующий (exe-файл), как видно из приведенного вами примера, вот такой (с переменованием, классов + добавил своё) - Код для exe -- код использующий <связное множество SpecialClass1, SpecialClass2, Special... >
Как видим, далее вы переопределили свои два класса и назвали их B и Extended. Я же, используя свой "шаблон проектного наследования" (назовём так. т.е. наследуется целый проект из N классов <-> к аналогичному множеству из N классов). Потому переименую B и Extended - в OtherClass1, OtherClass2. Т.е. OtherProject.dll : код определяющий <связное множество OtherClass1, OtherClass2, Other... > Как будут определены эти классы, т.е. унаследование целого проекта, об этом ниже, а пока глядя на ваш код, после создания этого проекта, ваш вызываемый код будет таким (сравните с премером выше) -
И что мы видим? То, что аналог вашего подхода (обычное наследование) -приводит к тому, что в используемом коде, (exe) - проекта OtherProject.dll , который наследован от SpecialProject.dll -- в каких то местах, применяется слово Other, а в каких то по прежнему Special ! Вот именно это и не устраивает. Парадигма моего "шаблона проектного наследования", такая, чтобы любой внешний код, использующий связное множество классов, <связное множество SpecialClass1, SpecialClass2, Special... > полностью был работоспособным, при замене всех определений в этом множестве, т.е. при замене всех 'Special' на 'Other' ! (Никаких приведений типов! Никаких использований "в одном месте Special, в другом -Other " .. ) Т.е. вот именно такой (применительно к данному случаю) должен быть код внешнего проекта, т.е. Код для exe -- код использующий <связное множество OtherClass1, OtherClass2, Other... >
Разобранный случай, с двумя классами самый простой, но вообще в таком шаблоне проектирования, будь экзешник использовать хоть любые N классов из проекта SpecialProject.dll, после создания другого унаследованного проекта OtherProject.dll, нужно так - чтобы во внешнем коде, было достаточно автоматически (даже автогенератором кода) заменить все слова 'Special' на 'Other' - и всё должно работать. Также еще интересная особенность - если в вышеописанном случае, сделать SpecialProject.dll --> в BasedProject.dll (т.е. просто переименовать все слова Special на Based), а в новом проекте OtherProject.dll переименовать слова Other на Special - то выходит, даже без перекомпиляции внешнего кода (к которому может и не быть доступа вообще) - подложив новую dll - мы заставим exe-файл работать по-другому, с некими другими возможностями. Правильно я всё описал? Надеюсь, теперь понятно. Итак, что же мы пропустили? А пропустили, описание нашего нового проекта. Псевдокод получается, должен быть таким. OtherProject.dll : код определяющий <связное множество OtherClass1, OtherClass2, Other... >
Если понятен псевдокод, и кто-то считает, что подобного на C# сделать нельзя, я спорить не буду, потому что пока еще не разбирал такие возможности. Но на C++ это сделать можно! И вот, в первом старт-посте этой темы, я это подробно и описал. Там у меня, от ModulePosition унаследовался сначала SpecialPosition . Затем от ModuleDrive (для него использовался шаблон+typedef) ---> сначала унаследовался через свойство КОВАРИАНТНОСТИ - класс TemplateDrive<SpecialPosition>, а уже от него - класс SpecialDrive. В конечном итоге, и SpecialDrive - наследник ModuleDrive , и всё что у него внутри определено как SpecialPosition - имеет в базовом классе тип ModulePosition . И поля, и сигнатуры методов, и даже испольования переменных в методах можно сделать. Таким образом, доводя стратегия дальше, можно целое множество классов в проекте, к примеру [SpecialPosition+SpecialDrive+SpecialAlgo rithmik+SpecialController + Special ... другие классы] -> dll унаследовать от [ModulePosition+ModuleDrive+ModuleAlgorit hmik+ModuleController + Module ... другие классы] -> dll и любой внешний проект (EXE), который ранее работал "над множеством" ModuleProject.dll, будет работать "над множеством" "расширенного" специализированного SpecialProject.dll, путем простой замены в его коде идентификаторов-слов - Module - на Special. Чтобы код внешнего проекта даже не перекомпилировать - делаем старый ModuleProject.dll -> в OldbaseProject.dll , а новый SpecialProject.dll --> в ModuleProject.dll. И EXE должен заработать с другими расширенными возможностями и алгоритмами. Этот шаблон проектирования я и называю, "шаблон проектного наследования", т.е. наследуется целый ПРОЕКТ, из N-связных классов, а не отдельный класс. Что есть код? Возьмем язык C#, он состоит из операторов, ключевых слов и т.д. Значит код на C# - это некая программа, использующая множество [+-*/ | & ... class struct public ... и т.д. ключевые слова ] Допустим я создал проект, из множества классов. Внешний код, используемый его, будет использовать Тьюринг-полный язык C# + множество новых возможностей, описанных в этом dll, т.е. множестве определений, [SpecialPosition+SpecialDrive+SpecialAlgo rithmik+SpecialController + Special ... другие классы как ключевые слова] -> dll Это как бы получается, "расширение возможностей C#". (без ArrayList и Hashtable и C# был бы не тем, чем он является). Значит, подменив dll с новым проектом, любой код ранее написанный для старого dll будет полностью переносимым + получит новые свойства. Допустим, SpecialProject.dll используется для решения некой переборной задачи. (расселить студентов в общагах с условиями, расставить коней на шахматной доске или какой то другой подобной. ) Можно заметить что многие алгоритмы, использующиеся для решения переборных задач, в чем-то идентичны. Затем был написан некий ВНЕШНИЙ код (EXE), его используемый (это может быть всё что угодно- редизайн , работа с этим проектом SpecialProject.dll и т.д.). Затем появилась некая другая переборная задача - OtherProject.dll "шаблон проектного наследования", который я тут выдумываю, позволит разработать этот OtherProject, так, чтобы средствами C#, его можно было использовать полностью аналогично проекту SpecialProject.dll . Код использования может быть точно таким же, за исключением замены всех слов-приставок в множестве связных классов проекта, (Special на Other). И эстетическая красота подобного решения завораживает. Ну, вроде расписал понятно. После внимательного прочтения, может быть теперь любой сможет понять? Добавлено через 37 минут Фактически, подобное решение, можно сделать и без "шаблона проектного наследования" и даже и вовсе без наследования. Но в таком случае, будет следующее "плохое последствие" - дублирование кода. Если при разработке обнаружится баг, то менять надо будет в обоих проектах, кроме того, поддержка проектов - тоже уже для двух (надо увеличивать ресурсы поддержки). А если таких проектов раплодится 5-10 - В десяти местах дублировать код.
0
|
|||||||||||||||||||||||||||
|
14139 / 9368 / 1350
Регистрация: 21.01.2016
Сообщений: 35,267
|
||||||
| 09.11.2017, 17:01 | ||||||
|
SergeyYN, для какой цели вы делаете это, а потом говорите, что оно вам не нравится:
Добавлено через 1 минуту Остальное читать не стал) Портянка какая-то)
0
|
||||||
|
83 / 1 / 0
Регистрация: 08.11.2017
Сообщений: 146
|
||||
| 09.11.2017, 17:23 [ТС] | ||||
|
В этой же строке нужно вызвать метод наследника (который у себя внутри может вызвать метод базового через base.DoThat(a); + дальше сделать что то своё новое.) (только классы переименовал приведя к своей системе + что то своё добавил. А метод DoThat - мой добавленный, не ваш).
0
|
||||
|
14139 / 9368 / 1350
Регистрация: 21.01.2016
Сообщений: 35,267
|
||
| 10.11.2017, 13:40 | ||
![]() Вы можете сжато и ясно изложить суть проблемы? Если нет, то ничего страшного.
0
|
||
| 10.11.2017, 13:40 | |
|
Помогаю со студенческими работами здесь
20
Можно ли считать шаблон Windows Form реализацией шаблона проектирования MVC Что это такое и как это можно сделать? нужно создать таблицу из 3 строк и 4 столбцов и заполнить её (любой информацией,это неважно) . Как это можно сделать ? Как можно определить какой это драйвер? Можно ли на планшете вместо 8ки поставить 7ку? Как это можно сделать? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|