如何访问同一个'类'的另一个实例的 '私有成员'?

相关问题: 使用闭包方法实现 OOP 时,如何实现保护成员? 尽管我试图实现的抽象不同,但问题很可能是相同的。


我目前正在使用 Lua 实现一棵树形结构来表示场景图。为此,Lua 有多种抽象类概念的方式,我使用的是这一种:

new_item = function()
    local _self = {}
    local _parent = nil
    local _children = {}

    _self.add_child = function(child)
        --将child添加到_children 
        table.insert(_children, child) --没有问题

        --将child的_parent设置为_self
        child._parent = _self --这行不起作用:'child._parent' 甚至不存在
    end

    返回_self
end

a = new_item()

b = new_item()
a.add_child(b)

new_item 返回的对象是一个带有一个名为 add_child 的单个项的表,这是我定义的函数。局部变量 _self_parent_children 局部于 new_item 的范围内,从每个“方法”中捕获,并且实际上是“类”的“私有成员”。

现在,为了保持树的一致性,我正在创建此函数 add_child,它将将传递的参数(预期是使用 new_item 创建的另一个对象) 添加到此对象的子对象列表中,并将子对象的父对象设置为此对象。

在 C++、C# 和 Java 中,我有“私有成员”的概念,我可以访问同一个类的不同实例的成员。然而,在 Lua 中,这些局部变量局限于 new_item 的范围内,因此它们不是导出对象的一部分,因此我无法访问它们。

我希望有一种方法来实现“访问同一类的另一个实例的私有成员”的抽象,或者执行其他操作,以便父母和子链接仅能使用可以被证明正确的导出“方法”进行修改。

我认为我想做的事在 Lua 中根本不可能,除非将' _parent '放在'_self'里(因此将其变成“公共的”),并请求没有人碰它,这是 Python 的做法,如果我没记错的话。

然而,可能有一种我没有想到的实现这一目标的方法,也许使用一种不同的方式抽象“类”的概念。有谁知道如何在 lua 中实现“访问同一个类的另一个实例的私有成员”的抽象吗?

点赞
用户1847592
用户1847592
function create_class()
   local class = {}

   -- 当对象被垃圾回收时,其私有数据将自动删除
   local private_data_of_all_objects = setmetatable({}, {__mode = "k"})

   function class.create_new_object()
      local object = {}
      local private = {}  -- 此对象的私有字段
      private.children = {}
      private.parent = nil
      private_data_of_all_objects[object] = private

      function object.add_child(child)
         table.insert(private.children, child)
         private_data_of_all_objects[child].parent = object
      end

      return object
   end

   return class
end

cl = create_class()

a = cl.create_new_object()
b = cl.create_new_object()
a.add_child(b)
2018-12-22 08:49:01