zoukankan      html  css  js  c++  java
  • 类与对象

     

    Lua类=元表元方法+元表的数据结构

    Lua面向对象

    可使用Lua的表和第一类函数在Lua中实现面向对象。 通过将函数和相关数据放入表中,形成对象。可使用元表实现继承,为父对象中不存在的函数(方法)和字段提供查找机制。

    Lua中的表具有状态和标识等对象的特征,与其值无关。 具有相同值的两个对象(表)是不同的对象,而对象在不同的时间可以具有不同的值,但它始终是相同的对象。 与对象一样,表的生命周期与谁创建它们或创建位置无关。

    真实世界的例子

    面向对象的概念广泛使用,但需要清楚地理解面向对象以获得适当和最大的好处。
    考虑一个简单的数学例子。 我们经常遇到处理不同形状的情况,如圆形,矩形和方形。

    形状可以具有共同的属性area。 因此,使用公共属性区域从基础对象形状扩展其他形状。 每个形状都可以有自己的属性,像矩形这样的函数可以具有属性lengthwidtharea作为属性,printAreacalculateArea作为它的函数。

    创建一个简单的类

    下面显示了具有三个属性lengthwidtharea的矩形的简单类实现。 它还有一个printArea函数来打印计算区域面积。

    -- Meta class
    Rectangle = {area = 0, length = 0, breadth = 0}
    -- Derived class method new
    function Rectangle:new (o,length,breadth)
       o = o or {}
       setmetatable(o, self)
       self.__index = self
       self.length = length or 0
       self.breadth = breadth or 0
       self.area = length*breadth;
       return oend
    -- Derived class method printArea
    function Rectangle:printArea ()
       print("The area of Rectangle is ",self.area)end

    Lua

    创建一个对象
    创建对象是为类实例分配内存的过程。 每个对象都有自己的内存并共享公共类数据。

    r = Rectangle:new(nil,10,20)

    Lua

    访问属性
    可以使用点(.)运算符访问类中的属性,如下所示 -

    print(r.length)

    Lua

    访问成员函数

    使用带有对象的冒号(:)运算符访问成员函数,如下所示 -

    r = Rectangle:new(nil,10,20)
    r:printArea()

    Lua

    分配内存并设置初始值。可以将初始化过程与其他面向对象语言中的构造函数进行比较。 它只是一个能够设置如上所示的值的函数。

    完整的例子
    下面来看一下在Lua中使用面向对象的完整示例。代码如下 -

    -- Meta class
    Shape = {area = 0}
    -- Base class method new
    function Shape:new (o,side)
       o = o or {}
       setmetatable(o, self)
       self.__index = self
       side = side or 0
       self.area = side*side;
       return oend
    -- Base class method printArea
    function Shape:printArea ()
       print("The area is ",self.area)end
    -- Creating an object
    myshape = Shape:new(nil,10)
     
    myshape:printArea()

    Lua

    运行上述程序时,将获得以下输出 -

    The area is     100

    Lua继承

    继承是将简单的基础对象(如形状)扩展为矩形,正方形等的过程。 它经常在现实世界中用于共享和扩展基本属性和功能。

    下面来看一个简单的类扩展。有一个如下所示的类,

    -- 元类
    Shape = {area = 0}
    -- 基类方法function Shape:new (o,side)
       o = o or {}
       setmetatable(o, self)
       self.__index = self
       side = side or 0
       self.area = side*side;
       return oend
    -- 基类方法 - printArea
    function Shape:printArea ()
       print("The area is ",self.area)end

    Lua

    可以将形状扩展为方形类,如下所示。

    Square = Shape:new()
    -- Derived class method new
    function Square:new (o,side)
       o = o or Shape:new(o,side)
       setmetatable(o, self)
       self.__index = self
       return oend

    Lua

    覆盖基类函数

    可以覆盖基类函数而不是在基类中使用函数,派生类可以有自己的实现,如下所示 -

    -- Derived class method printArea
    function Square:printArea ()
       print("The area of square is ",self.area)end

    Lua

    继承完整示例
    在另一个new方法的帮助下,使用metatables,扩展Lua中的简单类实现,如上所示。 基类的所有成员变量和函数都保留在派生类中。

    -- Meta class
    Shape = {area = 0}
    -- Base class method new
    function Shape:new (o,side)
       o = o or {}
       setmetatable(o, self)
       self.__index = self
       side = side or 0
       self.area = side*side;
       return oend
    -- Base class method printArea
    function Shape:printArea ()
       print("The area is ",self.area)end
    -- Creating an object
    myshape = Shape:new(nil,10)
    myshape:printArea()
     
    Square = Shape:new()
    -- Derived class method new
    function Square:new (o,side)
       o = o or Shape:new(o,side)
       setmetatable(o, self)
       self.__index = self
       return oend
    -- Derived class method printArea
    function Square:printArea ()
       print("The area of square is ",self.area)end
    -- Creating an object
    mysquare = Square:new(nil,10)
    mysquare:printArea()
     
    Rectangle = Shape:new()
    -- Derived class method new
    function Rectangle:new (o,length,breadth)
       o = o or Shape:new(o)
       setmetatable(o, self)
       self.__index = self
       self.area = length * breadth
       return oend
    -- Derived class method printArea
    function Rectangle:printArea ()
        print("The area of Rectangle is ",self.area)end
    -- Creating an object
     
    myrectangle = Rectangle:new(nil,10,20)
    myrectangle:printArea()

    Lua

    当运行上述程序时,将获得以下输出 -

    The area is     100
    The area of square is     100
    The area of Rectangle is     200

    在上面的例子中,创建了两个派生类 - 基类SquareRectangle。并在派生类中覆盖基类的函数。 在此示例中,派生类会覆盖函数printArea

  • 相关阅读:
    SAP系统和微信集成的系列教程之十:如何在SAP C4C系统里直接回复消息给微信用户
    SAP系统和微信集成的系列教程之九:如何将微信用户发送给微信公众号的内容自动转存到SAP C4C系统
    SAP系统和微信集成的系列教程之八:100行代码在微信公众号里集成地图搜索功能
    漫谈SAP产品里页面上的Checkbox设计与实现系列之一
    一个SAP成都研究院开发工程师的2020年度总结:未知生,焉知死
    Angular form控件原生HTML代码里ng-reflect-form属性和其值的生成时机
    一个SAP成都研究院开发工程师2020年所有文章列表
    SAP系统和微信集成的系列教程之七:使用Redis存储微信用户和公众号的对话记录
    用shell脚本从git上拉取,项目目录下所有各个子项目代码
    shell脚本小计
  • 原文地址:https://www.cnblogs.com/gd-luojialin/p/10962890.html
Copyright © 2011-2022 走看看