![]() |
Цитата:
Если точно уверены, что не будем наследовать, потому как со статическими методами не всё так просто. Вот пример. Есть базовый класс. Код:
package {Код:
package {Код:
new MyClass2().hello();В данном случае - легко заметная и быстро исправляемая. А в реальном проекте можно очень долго её ловить. |
2morrowMan, здесь профессиональный форум и изначально я отношусь к любому как к коллеге, уважительно.
При этом не имеет значения уровень - что гуру, что начинающий, в моих глазах имеет одинаковый респект. Но блин, есть же общепринятые нормы общения. Если высказываешься, будь готов аргументировать свою точку зрения. Я готов поспорить и с удовольствием откажусь от собственных заблуждений, если оппонент мне аргументированно докажет это. С удовольствием, подчеркиваю. Потому, что этот человек подымет мой проф уровень, за что ему респект и спасибо. Но не все понимают и частенько весь их текст несет информации не более чем пук в воду. Это бесит. |
Iv, я аргументировал. что у тебя вызвало вопрос, я не понимаю. извини, что не умею писать 10 кб текста неся при это одну единственную мысль: "ты привёл не правильные примеры использования синглтонов". ну не прозаик я. написал коротко и ясно. ты обиделся почему-то. извини.
WindWalker, я не понимаю зачем вы пытаетесь переопределить приватный, к тому же статический метод, не используя слово override. Может я не понимаю, но у меня в обоих случаях выводится: "Hello from class 1". если вы хотели переопределить, то надо было написать так: Код:
package { |
Цитата:
override вообще нельзя писать одновременно со static (как я буквально только что выяснил :)). Цитата:
Преимущество синглтона в том, что он - экземпляр. 1. У него нормальные методы, которые можно переопределять (со статическими просто так не выйдет). 2. Он может имплементировать интерфейс (попробуйте сделать это со статическими методами). 3. В последствии мы можем отказаться от требования иметь только один экземпляр, и насоздавать их несколько. |
Цитата:
Цитата:
2. это я написал в самом начале разговора. использование синглтона в принципе может быть обусловленно, только имплементацией определённого интерфейса. иначе он просто не имеет смысла, и приводит к потери скорости работы приложения и потери скорости разработки приложения. 3. если такая необходимость возникнет (это ошибка проектирования), то вам никак это не поможет. вам придётся переколбасить кучу кода, что бы везде привести работу к конкретному экземпляру. работы будет не меньше, чем со статиками. можно конечно на скорую руки превратить синглтон в мультитон, и сделать дефолный аргумент, по которому будет возвращаться используемый вами везде экземпляр, но этот путь приведёт к запутыванию кода, и непониманию его работы в целом. update: забыл аргументировать первый пункт (специательно для Вани). 1. никакого преимущества. так как Ваня описал выше, это класс который должен быть один одинёшеньки. наследование такого класса может привести к непредсказуемым последствиям. так как вполне логично, что и наследник будет выполнять схожие со стоим родителем задачи, их действия могут пересечься, что слегка нарушит всё логическое обоснование одиночки. |
А я не люблю паттерны. =)
Раньше использовал синглтон только если в глобальной точке доступа необходимо было наследоваться или имплементировать какой-то интерфейс (например IEventDispatcher). Потом отказался в пользу обыкновенных объектов находящихся в статических константах. Стало проще жить =). P.S. BlooDHounD, синглтон - интуитивно финальный класс, это все понимают. В первом пункте речь о наследовании полей самим синглтоном, т.е. о том из-за чего и я использовал его в начале. |
Цитата:
Цитата:
|
Код:
public class Singleton extend EventDispatcher{} |
я то это понимаю. это и называется "определённый интерфейс". это пункт 2.
|
Цитата:
Далее можно наследовать (если очень хочется). Со статическими методами не всё так просто. Можно превратить их в public, но переопределять их всё равно не сможем. Цитата:
Вот в нём-то, если надо, и делаем необходимые изменения, чтобы первым создавался именно экземпляр наследника, а не родителя. Цитата:
Но согласен, в AS3 это уже не актуально. Цитата:
Пример с сетевым соединением как раз мне нравится. Допустим, первоначально предполагалось, что соединение должно быть одно и только одно. Сделали синглтончик Connection. Потом решили, что надо балансировать нагрузку и сделать так, чтобы клиент имел несколько параллельных соединений к разным серверам и примерно пропорционально раскидывал запросы между ними. Модифицируем Connection - делаем так, чтобы он больше не был синглтоном, а метод getInstance возвращал наименее занятое соединение (например, просто по принципу револьвера, но это уже не так важно). И ещё не забываем, что у нас есть класс-посредник (в случае с соединениями например класс Request). И про одиночку и его одиночество знает только этот посредник (да и то не всегда). Соответственно, и необходимые изменения (возможно, хотя и не всегда конечно) достаточно будет сделать только в нём. Цитата:
Опять же сетевое соединение. Опять же одновременно только одно. Но! Сперва пробуем SocketConnection, если обломались, то его убиваем и используем HTTPConnection. Оба наследуются от некоего AbstractConnection. Вот тут уже возникает более интересный вопрос: как реализовать "расширенную одиночку", который гарантирует одновременное существование только одного экземпляра с учётом всех потомков? Вот на этот вопрос я сейчас не знаю как ответить. :) И на вопрос "а нафиг это вообще надо" тоже :) Но есть ощущение, что чисто статическими методами тут тоже не обойтись (точнее обойтись то можно, но выйдет некрасиво). P.S. Хотя насчёт "расширенной одиночки" подозреваю, что тут всё довольно просто - кто раньше встал, того и тапки. Статическая переменная instance то одна для всех. Как только чей-то экземпляр туда засунули, все остальные автоматически идут лесом. |
| Часовой пояс GMT +4, время: 04:06. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.