Приветствуем вас на форуме проекта WoW Circle. Если вы читаете это, значит не зарегистрировались у нас. Для того, чтобы получить доступ к расширенным возможностям нашего форума нажмите сюда и пройди регистрацию, которая не займет у вас много времени. После регистрации будут доступны новые, более расширенные, возможности.
Коротко : ООП и наследование

Упомянутые в теме пользователи:

Показано с 1 по 1 из 1
  1. #1
    Инопланетянин
    Регистрация
    20.03.2012
    Сообщений
    4,192
    Поблагодарил(а)
    362
    Получено благодарностей: 1,439 (сообщений: 839).
    Репутация: 2399

    Коротко : ООП и наследование

    Классы и объекты ...

    Конструкция tbl:func() (при объявлении функции и при ее вызове) предоставляет основные возможности, позволяющие работать с таблицей как с объектом. Основная проблема состоит в порождении многих объектов, имеющих сходное поведение т.е. порожденных от одного класса:,

    PHP код:
    function class()
        
    cl = {}
        
    cl.__index cl            -- cl будет использоваться как мета-таблица
        
    return cl
      end

      
    function objectclobj )
        
    obj obj or {}             -- а вдруг есть уже заполненные поля?
        
    setmetatable(objcl)
        return 
    obj
      end 
    Здесь функция class создает пустую таблицу, подготовленную к тому, чтобы стать мета-таблицей объекта. Методы класса делаются полями этой таблицы т.е. класс является таблицей, одновременно содержащей методы объекта и его мета-методы. Функция object() создает объект заданного класса — таблицу, у которой в качестве мета-таблицы установлен заданный класс. Во втором аргументе может быть передана таблица, содержащая проинициализированные поля объекта.

    PHP код:
      Some_Class = class()

      function 
    Some_Class:foo() ... end

      
    function Some_Class:new()
        return 
    object(self, { xxx 12 })
      
    end

      x 
    Some_Class:new()

      
    x:foo() 
    Наследование ...

    В описанной реализации мета-таблица класса остается не использованной, что делает простой задачу реализации наследования. Класс-наследник создается как объект класса, после чего в нем устанавливающая поле __index таким образом, чтобы его можно было использовать как мета-таблицу:

    PHP код:
      function subclasspcl )
        
    cl pcl:new()           -- создаем экземпляр
        cl
    .__index cl          -- и делаем его классом
        
    return cl
      end 
    Теперь в полученный класс-наследник можно добавить новые поля и методы:

    PHP код:
      Der_Class subclass(Some_Class)

      function 
    Der_Class:new()
        
    local obj object(selfSome_Class:new())
        
    obj.yyy 13                      -- добавляем новые поля
        
    return obj
      end

      
    function Der_Class:bar() ... end    -- и новые методы

      y 
    Der_Class:new()

      
    y:foo()
      
    y:bar() 
    Единственный нетривиальный момент здесь состоит в использовании функции new() из класса-предка с последующей заменой мета-таблицы посредством вызова функции object().

    При обращении к методам объекта класса-наследника в первую очередь происходит их поиск в мета-таблице т.е. в самом классе-наследнике. Если метод был унаследован, то этот поиск окажется неудачным и произойдет обращение к мета-таблице класса-наследника т.е. к классу-предку.

    Основной недостаток приведенного общего решения состоит в невозможности передачи параметров в функцию new() класса-предка.
    Последний раз редактировалось DreamlØlz; 22.10.2015 в 15:34.

  2. 1 пользователь сказал cпасибо DreamlØlz за это полезное сообщение:

    Sproody (01.09.2018)

Похожие темы

  1. Костарико
    от Webgirl в разделе Нарушители
    Ответов: 2
    Последнее сообщение: 30.05.2015, 20:09
  2. Коротко о Дренеях.
    от Тайлай в разделе Атлас тайн Азерота
    Ответов: 0
    Последнее сообщение: 16.03.2013, 09:58

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •