zoukankan      html  css  js  c++  java
  • Lua语言学习-面向对象

    菜鸟教程 https://www.runoob.com/lua/lua-object-oriented.html

    面向对象特征
    1) 封装:指能够把一个实体的信息、功能、响应都装入一个单独的对象中的特性。
    2) 继承:继承的方法允许在不改动原程序的基础上对其进行扩充,这样使得原功能得以保存,而新功能也得以扩展。这有利于减少重复编码,提高软件的开发效率。
    3) 多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。
    4)抽象:抽象(Abstraction)是简化复杂的现实问题的途径,它可以为具体问题找到最恰当的类定义,并且可以在最恰当的继承级别解释问题。

    对象 --> 属性+方法

    lua中使用table + function来实现面向对象

    -- Meta class
    Shape = {area = 0}
    
    pMate = {__index = Shape}
    -- 基础类方法 new
    function Shape:new (o,side)
      local o = o or {}
      -- 3种写法
     setmetatable(o, pMate)
        
      -- setmetatable(t, {__index = self})
      
      --setmetatable(o, self)
      --self.__index = self
      
      side = side or 0
      self.area = side*side;
      return o
    end
    
    -- 基础类方法 printArea
    function Shape:printArea ()
      print("面积为 ",self.area)
    end
    
    -- 创建对象
    myshape = Shape:new(nil,10)
    
    myshape:printArea()

    实现了继承的示例

    -- Meta class
    Shape = {area = 0}
    -- 基础类方法 new
    function Shape:new (o,side)
      o = o or {}
      setmetatable(o, self)
      self.__index = self
      side = side or 0
      self.area = side*side;
      return o
    end
    -- 基础类方法 printArea
    function Shape:printArea ()
      print("面积为 ",self.area)
    end
    
    -- 创建对象
    myshape = Shape:new(nil,10)
    myshape:printArea()
    
    Square = Shape:new()
    -- 派生类方法 new
    function Square:new (o,side)
      o = o or Shape:new(o,side)
      setmetatable(o, self)
      self.__index = self
      return o
    end
    
    -- 派生类方法 printArea
    function Square:printArea ()
      print("正方形面积为 ",self.area)
    end
    
    -- 创建对象
    mysquare = Square:new(nil,10)
    mysquare:printArea()
    
    Rectangle = Shape:new()
    -- 派生类方法 new
    function Rectangle:new (o,length,breadth)
      o = o or Shape:new(o)
      setmetatable(o, self)
      self.__index = self
      self.area = length * breadth
      return o
    end
    
    -- 派生类方法 printArea
    function Rectangle:printArea ()
      print("矩形面积为 ",self.area)
    end
    
    -- 创建对象
    myrectangle = Rectangle:new(nil,10,20)
    myrectangle:printArea()

    游戏中entity和player的使用示例

    _G.entityBase = {}
    function entityBase.new(  t )
        t = t or { }
        t.pos = _Vector3.new()
        t.sizeR = 5
        t.shadowR = 5
        
        t.isTransform = entityBase.isTransform
    
        return t
    end
    --是否变身中
    function entityBase:isTransform()
    end
    
    
    
    
    
    _G.player = {}
    local playerMeta = { __index = player }
    
    function player.new( t )
        local p = t or {}
        p = entityBase.new( p )
        p.target = _Vector3.new( 0, 0, 0 )
    
        p.sca3D = _Matrix3D.new()
        p.rot3D = _Matrix3D.new()
        p.tran3D = _Matrix3D.new()
    
        p.sca3D.parent = p.rot3D
        p.rot3D.parent = p.tran3D    --xmzNote
    
        p.type = 'player'
        p.sex = MAN
        p.id = ''
        p.tfid = 0
    
        return setmetatable( p, playerMeta )
    end
    function player:isReLevel()--是否转生
    end
    
    function player:getRealmImage()
    end
  • 相关阅读:
    codeforces #550D Regular Bridge 构造
    java学习路线-Java技术人员之路从0基础到高级
    iOSeasy造成循引用的场景
    Hybird App(一)----第一次接触
    PNP管理器简析--基于ReactOS0.33
    为什么寄存器比内存快?
    cookie 与 session 的差别、联系
    webstorm 配合IIS使用
    js实现可拉伸移动的div
    无法识别的属性“targetFramework”。请注意属性名称区分大小写
  • 原文地址:https://www.cnblogs.com/orxx/p/10840199.html
Copyright © 2011-2022 走看看