使用 OOP 的闭包方法时如何实现受保护的成员?

2024-04-08

现在我正在使用实施 OOP 的闭包 http://lua-users.org/wiki/ObjectOrientationClosureApproach在卢阿。下面是一个简短的示例。我的问题发生在尝试实施时stronger_heal inside infested_mariner.

--------------------
-- 'mariner module':
--------------------
mariner = {}

-- Global private variables:
local idcounter = 0
local defaultmaxhp = 200
local defaultshield = 10  

function mariner.new ()
   local self = {}

   -- Private variables:  
   local hp = maxhp        

   -- Public methods:

   function self.sethp (newhp)
      hp = math.min (maxhp, newhp)
   end
   function self.gethp ()
      return hp
   end
   function self.setarmorclass (value)
      armorclass = value
      updatearmor ()
   end


   return self
end

-----------------------------
-- 'infested_mariner' module:
-----------------------------

-- Polymorphism sample

infested_mariner = {}

function infested_mariner.bless (self)

   -- New methods:
   function self.strongerheal (value)
     -- how to access hp here?
     hp = hp + value*2  
   end      

   return self
end

function infested_mariner.new ()
   return infested_mariner.bless (mariner.new ())
end

如果我把我的infested_mariner如果在另一个 .lua 文件中定义,它将无法访问全局私有变量,也无法访问基本 .lua 文件中定义的私有变量。我如何保护仅infested_mariner可以访问,并且解决方案不涉及将所有派生类与父类放在同一个文件中?

注意:我目前在子类中使用 getter 和 setter。


这是封闭方法的限制。没有办法访问hp从封闭外部。

这是一种意识形态问题......有些人说受保护的成员破坏了封装,因此应该避免它们:将所有数据设为私有,并在需要时扩展接口(添加公共功能)。说这句话的人往往喜欢封闭方法。

如果你想使用受保护的成员,我可能会not使用闭包方法。良好的命名约定可能是最简单的事情。

self.public_thing = "asdf"
self._protected_thing = "asdf"

当然,数据实际上是公开的,但这种方法效果很好。这几乎就是 Python 所做的事情。当您想要搞乱内部结构(例如测试)时,它会派上用场。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 OOP 的闭包方法时如何实现受保护的成员? 的相关文章

  • 使用 C# 9.0 记录构建类智能枚举/类判别联合/类和类型数据结构?

    玩弄record在 C 中输入 看起来它对于构建类似可区分联合的数据结构非常有用 我只是想知道我是否错过了一些我以后会后悔的陷阱 例如 abstract record CardType Case types public record Ma
  • 依赖注入容器——工厂模式

    我一直在尝试了解依赖注入 并一直在阅读并尝试编写一个类似于以下内容的小型依赖注入容器 http fabien potencier org article 12 do you need a dependency injection conta
  • 表长度运算符的性能

    卢阿有 运算符来计算用作数组的表的 长度 在诸如 C 之类的语言中 计算出某个内容的长度后 通常不会再次计算它 例如int len strlen string 这在 Lua 中有什么不同吗 其中一个的效率是否比另一个低 显然这可能不会显示显
  • 类外函数

    我只是想告诉你 我是 OOP 的新手 这对我来说相当困难 但这是我的代码 class functions function safe query string string mysql escape string htmlspecialch
  • 在 Python 中使用类作为命名空间是个好主意吗

    我正在将一堆相关的东西放入一个类中 主要目的是将它们组织到命名空间中 class Direction north 0 east 1 south 2 west 3 staticmethod def turn right d return tu
  • 为什么 java.util.Scanner 类被声明为“final”?

    我用扫描仪类 http docs oracle com javase 6 docs api java util Scanner html用于读取多个相似的文件 我想扩展它以确保它们都使用相同的分隔符我还可以添加类似的方法跳过直到你找到 字符
  • PHP:数据库连接类构造方法

    我是面向对象编程的新手 最初 我是在类内部和构造函数外部定义变量并为其赋值 但是在今天的 Java OOP 课程之后 我被告知这是不好的风格 应该避免 这是我模拟的原始 PHP 数据库连接类 class DatabaseConnection
  • 如何从表成员中引用lua表成员?

    我在 lua 有一张表 enUS LOCALE STHOUSANDS Thousands separator e g comma patNumber d LOCALE STHOUSANDS d regex to find a number
  • 模式 ^u.meta(\.|$) 未按预期工作

    我有这个模式 u meta 预期行为 u meta 将匹配所有角色 例如 u meta u meta admin u meta admin system u meta 它不应该匹配如下所示的内容 u meta admin u meta ad
  • 为什么必须使用“out”而不是ref?

    我写了一些关于 ref out 声明的代码块 我认为 ref 最有用 好的 为什么我需要用完 我每次都可以使用always ref namespace out ref class Program static void Main strin
  • 可以在一堂课上延长两堂课吗? [复制]

    这个问题在这里已经有答案了 可能的重复 我可以在 PHP 中使用多个类来扩展一个类吗 https stackoverflow com questions 356128 can i extend a class using more than
  • getter 和 setter 的目的? [复制]

    这个问题在这里已经有答案了 可能的重复 公共数据成员与 Getters Setters https stackoverflow com questions 2977007 public data members vs getters set
  • 全局常量是反模式吗?

    我一直认为仅仅为了保持常量而创建一个类是一个糟糕的设计 但最近 我尝试用谷歌搜索它 发现只有一个界面作为常量是不好的反模式 没有提到使用一类常量 我认为 由于常量类实际上与全局变量没有太大区别 这就是我反对它并倾向于重构此类类的原因 它创建
  • 如何重载泛型方法以使其在 Typescript 中不那么泛型?

    我在抽象类中有一个通用静态方法 abstract class Base static find
  • 过渡到面向对象的ABAP?

    看来我们大多数 SAP 程序员都在使用旧版本的 ABAP 也就是面向对象之前的版本 我还注意到 面向对象的语言更加干净 更加现代 他们显然借此机会摆脱了不推荐使用的东西 由于该系统尚未推出 因此重新设计的时机宜早不宜迟 是否值得要求将新代码
  • 在Python中将字典转换为以键作为对象名称的对象

    我有一本这样的字典 d item1 Hi 150 495 item2 Hola 590 40 我想将其转换为对象 如果可能的话递归地 我有一堂课 class Item def init self thetuple self greeting
  • luajit2.0.0 -- 分段错误:11

    我使用一个简单的例子http lua users org wiki SimpleLuaApiExample http lua users org wiki SimpleLuaApiExample进行测试 该示例可以成功静态链接libluaj
  • 覆盖默认标识符生成策略对关联没有影响

    交响乐 2 7 2 学说 ORM 2 4 7 MySQL 5 6 12 PHP 5 5 0 我有一个具有自定义 ID 生成器策略的实体 它工作完美 在某些情况下 我必须使用 手工制作 的 ID 来覆盖此策略 当主实体在没有关联的情况下被刷新
  • 我应该使用课程吗? (Python)

    我正在尝试编写一个包含一些数学函数的小型 Python 模块 例如 它可能包含如下函数 def quad x a b c return a x 2 b x c 您可能会注意到它包含几个参数 即a b c 除了变量x 现在 如果我将其放入文件
  • 在 Lua 中更改元表会破坏冒号运算符

    在学习Lua的过程中 我借用了一些代码here http lua users org wiki StringIndexing使用字符串索引 正是这样 getmetatable index function str i return stri

随机推荐