实现类和继承、多重继承和多态

这篇博客介绍了如何在Lua中实现类和继承机制,包括成员数据的继承、接口的继承以及多态性。通过`Class`函数构造出具有元表和成员函数的table,支持多重继承。示例代码展示了如何创建类B1、B2和子类D,并演示了如何通过`Inherit`和`New`方法进行实例化和方法调用。这种实现方式确保了多态性,当在子类中找不到方法时,会查找基类的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

lua的类也是一个table,它有自己的metatable,主要有__index元操作,有成员函数,有构造函数,设计这样一个函数,它构造出这样一个table。

 

function Class(t)
 local class = {};
 class.__member_data = t or {};
 class.__index = class;

 function class:InheritMemberData(...)
  local base = {self, ...};
  local member_data = {};
  for _, t in pairs(base) do
   for k, v in pairs(t.__member_data) do
    if member_data[k] then
     print("redefined member data '" .. k .. "'");
    else
     member_data[k] = v;
    end
   end
  end
  self.__member_data = member_data;
 end;

 function class:InheritInterface(...)
  local base = {self, ...};
  if select("#", ...) == 1 then
   setmetatable(self, ...);
  else
   self.__index = function(_, key)
    for k, v in pairs(base) do
     local value = v[key];
     if value then
      return value;
     end
    end
   end;
  end
 end;

 function class:Inherit(...)
  self:InheritMemberData(...);
  self:InheritInterface(...);
  return self;
 end;

 function class:New(o)
  local obj = {};
  for k, v in pairs(self.__member_data) do
   obj[k] = v;
  end
  for k, v in pairs(o or {}) do
   if obj[k] then
    obj[k] = v;
   end
  end
  setmetatable(obj, self);
  return obj;
 end;

 return class;
end

 

使用的时候就像下面这样:

 

B1 = Class {
 x = 0; -- 成员定义和默认值
};

function B1:GetX() -- 成员函数定义
 return self.x;
end

B2 = Class {
 y = 0;
};

function B2:GetY()
 return self.y;
end

D = Class {
 z = 0;
}:Inherit(B1, B2); -- 继承自B1和B2,继承所有的成员数据和成员函数

function D:GetZ()
 return self.z;
end

local d = D:New{x = 1, y = 2, z = 3};

print(d:GetX(), d:GetY(), d:GetZ());

 

这种继承,是有多态的性质的,如果在子类中找不到某个名字,才会去基类中找,如果子类中有override的接口,则会调用子类的。最后还差一个权限控制,也就是隐藏信息,下回设计。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值