zoukankan      html  css  js  c++  java
  • openresty开发系列23--lua面向对象

    openresty开发系列23--lua面向对象

    面向对象编程(Object Oriented Programming,OOP)是一种非常流行的计算机编程架构。
    java,c++,.net等都支持面向对象

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

    一)Lua 中面向对象
    对象由属性和方法组成,lua中的面向对象是用table来描述对象的属性,function表示方法;
    LUA中的类可以通过table + function模拟出来。

    一个简单实例
    以下简单的类代表矩形类,包含了二个属性:length 和 width;getArea方法用获取面积大小

    新建rect.lua脚本

    local rect = {length = 0, width = 0}

    -- 派生类的方法 new
    function rect:new (length,width)
      local o = {
         --设定各个项的值
         length = length or 0,
         width = width or 0
      }
      setmetatable(o, {__index = self})
      return o
    end

    -- 派生类的方法 getArea
    function rect:getArea ()
      return self.length * self.width
    end

    return rect

    -----------------test.lua------------------------

    引用模块
    local rect = require("rect")

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

    local rect1 = rect:new(10,20)
    local rect2 = rect:new(5,6)

    访问属性  ----》 rect1.length
    访问成员函数  ----》rect1:getArea()

    print("长度1:",rect1.length);
    print("面积1:",rect1:getArea());  --- 点号 和 冒号 调用前面课程已经介绍
    print("长度2:",rect2.length);
    print("面积2:",rect2:getArea());


    二)Lua继承

    -------------------shape基类---------------------------

    local shape = {name = ""}

    -- 创建实体对象方法 new
    function shape:new (name)
      local o = {
        name = name or "shape"
      }
      setmetatable(o, {__index = self})
      return o
    end

    -- 获取周长的方法 getPerimeter
    function shape:getPerimeter ()
      print("getPerimeter in shape");
      return 0
    end

    -- 获取面积的方法 getArea
    function shape:getArea ()
      print("getArea in shape");
      return 0
    end

    function shape:getVum ()
      print("getVum in shape");
      return 0
    end

    return shape

    ----------------------triangle继承类----------------------------

    local shape = require("shape")

    local triangle = {}

    -- 派生类的方法 new
    function triangle:new (name,a1,a2,a3)
      local obj = shape:new(name);
     
      --1)当方法在子类中查询不到时,再去父类中去查找。
      local super_mt = getmetatable(obj);
      setmetatable(self, super_mt);
     
      --2)把父类的元表 赋值super对象
      obj.super = setmetatable({}, super_mt)
     
      --3)属性赋值
      obj.a1 = a1 or 0;
      obj.a2 = a2 or 0;
      obj.a3 = a3 or 0;
     
      setmetatable(obj, { __index = self })
     
      return obj;
    end

    -- 派生类的方法 getPerimeter
    function triangle:getPerimeter()
      print("getPerimeter in triangle");
      return (self.a1 + self.a2 + self.a3);
    end

    -- 派生类的方法 getHalfPerimeter
    function triangle:getHalfPerimeter()
      print("getHalfPerimeter in triangle");
      return (self.a1 + self.a2 + self.a3) / 2
    end

    return triangle

    ------------------test-----------------------

    local rect = require("rect")
    --local shape = require("shape")
    local triangle = require("triangle")
     
    local rect1 = rect:new(10,20)
    local rect2 = rect:new(5,6)

    --local shape1 = shape:new();

    local triangle1 = triangle:new("t1",1,2,3)
    local triangle2 = triangle:new("t2",6,7,8)

    print("长度1:",rect1.length);
    print("面积1:",rect1:getArea());
    print("===============");
    print("长度2:",rect2.length);
    print("面积2:",rect2:getArea());
    print("===============");
    --print("shape1 getPerimeter:",shape1:getPerimeter())
    print("===============");
    ----覆盖了shape的方法
    print("t1 getPerimeter:",triangle1:getPerimeter())
    print("t1 getHalfPerimeter:",triangle1:getHalfPerimeter())

    print("t2 getPerimeter:",triangle2:getPerimeter())
    print("t2 getHalfPerimeter:",triangle2:getHalfPerimeter())

    ---- 从shape继承的getVum方法
    print("t1 getVum:",triangle1:getVum())
    print("t2 getVum:",triangle2:getVum())
    print("===============");
    print("t2 super getPerimeter:",triangle2.super:getPerimeter())

  • 相关阅读:
    打印九九乘法表
    PAT (Basic Level) Practice (中文) 1091 N-自守数 (15分)
    PAT (Basic Level) Practice (中文)1090 危险品装箱 (25分) (单身狗进阶版 使用map+ vector+数组标记)
    PAT (Basic Level) Practice (中文) 1088 三人行 (20分)
    PAT (Basic Level) Practice (中文) 1087 有多少不同的值 (20分)
    PAT (Basic Level) Practice (中文)1086 就不告诉你 (15分)
    PAT (Basic Level) Practice (中文) 1085 PAT单位排行 (25分) (map搜索+set排序+并列进行排行)
    PAT (Basic Level) Practice (中文) 1083 是否存在相等的差 (20分)
    PAT (Basic Level) Practice (中文) 1082 射击比赛 (20分)
    PAT (Basic Level) Practice (中文) 1081 检查密码 (15分)
  • 原文地址:https://www.cnblogs.com/reblue520/p/11434004.html
Copyright © 2011-2022 走看看