在 Perl 6 中继承私有属性

2023-11-21

我在文档中找不到任何内容,但似乎子类中无法访问其超类的私有变量。我对吗?

class A {
  has $!a;
}

class B is A {
  has $.b;

  method set_a($x) {
    $!a = $x;
  }
}

my $var = B.new();
$var.set_a(5);
say $var.a;

这给出了一条错误消息:

Attribute $!a not declared in class B

顺便说一句,在哪里可以阅读文档中的类?我只找到了一个相当短的部分类和对象.


在 Perl 6 中,类中声明的属性只能在该类中访问。这意味着人们可以自信地重构类中的状态,而不必担心该状态在类之外的任何使用。

子类不接受任何有关属性的特殊访问。有些语言提供了protected修饰符。根据设计,Perl 6 中不存在这种情况。要么是该类私有的,要么是公开的(比如has $.a)对于外界来说,因为:

  1. 就该类而言,子类是外部世界的一部分。
  2. 鉴于一般建议是“优先选择组合而不是继承”,赋予继承特权,或者提供一种阻止从继承到组合的重构的机制似乎很奇怪。

a 中的属性role相比之下,它们被组合到类中,就像它们已在类本身中声明一样工作。因此,来自组合的属性role可以在类主体中使用。如果希望在 OO 上下文中编写可重用的功能块,那么更典型的是在 Perl 6 中使用角色和组合,而不是继承。事实上,将原始代码写为:

role A {
  has $!a;
}

class B does A {
  has $.b;

  method set_a($x) {
    $!a = $x;
  }
  method a() { $!a }
}

my $var = B.new();
$var.set_a(5);
say $var.a;

按预期工作。

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

在 Perl 6 中继承私有属性 的相关文章

  • 这是 isinstance pythonic/“good” 的用法吗?

    的副作用是this https stackoverflow com questions 3110624 why typeclassinstance is returning instance 3110654 3110654问题是我被引导到这
  • 值类型如何实现引用类型

    我遇到了一个值类型正在实现 ref 的场景 类型 只是想知道这怎么可能 幕后发生了什么 结构体是值类型 接口是引用 类型但结构可以实现接口而不会出现任何错误 有什么想法吗 提前致谢 实际上 它同时以两种不同的方式进行 首先 任何值类型都可以
  • 如何在 Perl6 NativeCall 结构中定义固定长度字符串?

    我有一个第三方 C 库 它定义了一个类似于以下内容的结构 struct myStruct int a int b char str1 32 char str2 32 还有一个函数 它接受指向该结构的指针并填充它 我需要 Perl6 本机调用
  • 类外函数

    我只是想告诉你 我是 OOP 的新手 这对我来说相当困难 但这是我的代码 class functions function safe query string string mysql escape string htmlspecialch
  • 无法分配给对象“[object Object]”的只读属性“名称”

    以下代码仅会抛出错误name财产 可以通过指定来修复name属性可写Object create争论但是我试图理解为什么会发生这种情况 也许有一种更优雅的方法来解决它 var BaseClass function data Object as
  • 逗号 IDE 中的“SDK 未设置”

    我正在尝试使用 Comma IDE 进行调试 但遇到了这个问题 9 20 Error running Primera SDK is not set Primera是我创建的配置 大部分使用默认值 我浏览了菜单 但没有找到在哪里可以设置 SD
  • 句柄类和值类的区别

    我有一些 C 背景 想使用 Matlab 中的类 句柄和值类有什么区别 我知道如果我想定义一个带有重载运算符 例如 和 的矩阵类 我会使用值类 然而 有时 当我选择一个手柄类时 事情似乎只对我有用 MathWorks 提供了一些有关其用途的
  • 如何防止 Nil 将容器恢复为其默认值?

    我正在实现一个简单的链表并表示没有下一个节点的事实 我正在使用该值Nil 问题是当分配给容器时 Nil将尝试将容器恢复为其默认值 这意味着我需要使用容器的默认值或Any确定是否已到达链表的末尾 不过 我还是想用Nil 如果只是为了其明确的意
  • 如何让 Raku 中的承诺超时?

    我知道我可以安排Promise在给定的时间内保存 my promise Promise in seconds 但我怎样才能安排它被破坏呢 具体来说 我正在考虑一个将 超时 的承诺 以便它必须保留一定的时间 否则它将失败 我可以和另一个人一起
  • 如何使用 php __toString

    有什么用途 toString in PHP 例如 我有一个函数 例如 在一个名为 person 的类中 public function construct id name this gt id id this gt name name an
  • 如何重载泛型方法以使其在 Typescript 中不那么泛型?

    我在抽象类中有一个通用静态方法 abstract class Base static find
  • 继承php中的属性

    我有一个超类 其中包含用于设置它们的属性和方法 class Super private property function construct set this gt property set 然后我有一个需要使用该属性的子类 class
  • 如何重写 NQPMatch.Str 函数

    或者如何改变
  • 如何在两个类之间共享数据

    Question 有没有一种方法可以让两个类同时相互继承 背景 我目前正在开发一个 Socket Server 项目 在这个项目中 我有两个课程 一个Server类 以及一个GUI班级 他们的目的是不言自明的 但是 我显然需要让两个班级相互
  • 在调用超类的构造函数之前,有什么方法可以在Java中初始化子类的成员变量吗?

    我需要这个 因为超类中的构造函数正在调用子类中重写的方法 该方法返回一个值 该值被传递给子类的构造函数 但是超类构造函数必须在子类构造函数之前调用 所以我没有机会保存传入的值 从超类构造函数调用重写的方法根本行不通 不要这样做 超类构造函数
  • 在Python中将字典转换为以键作为对象名称的对象

    我有一本这样的字典 d item1 Hi 150 495 item2 Hola 590 40 我想将其转换为对象 如果可能的话递归地 我有一堂课 class Item def init self thetuple self greeting
  • 非静态类中的静态方法和静态类中的静态方法有什么区别?

    我有两个班级A级和B级 static class ClassA static string SomeMethod return I am a Static Method class ClassB static string SomeMeth
  • 如何禁用 Perl 6 REPL 创建 .precomp

    每次我跑步perl6进入REPL模式 它创建了一个 precomp目录 这也会减慢提示的出现速度 如果 precomp目录已经存在 提示几乎立即出现 否则perl6创建它需要几秒钟 有没有办法禁用此功能 检查您是否有PERL6LIB环境变量
  • 如何从父类中获取子类名

    我试图在不需要子类上的函数的情况下完成此任务 这可能吗 我有一种感觉 但我真的很想确定
  • 从 Robot Framework 访问 python 类的变量

    我有一个 python 文件 例如 Animals py 在里面我定义了 3 个不同的类 如下所示 Animals py class Animal listAnimal dog cat lt def init self Animal con

随机推荐

  • $lookup 数组中的 ObjectId

    在 ObjectId 数组而不仅仅是单个 ObjectId 字段上执行 lookup 的语法是什么 订单文档示例 id ObjectId products ObjectId
  • 为什么 Visual Studio Code 中文件资源管理器中的子文件夹会折叠成一行?

    我对 VS Code 比较陌生 我想我一定是不小心更改了设置 VS Code 过去常常清晰地显示下面的所有子文件夹 并从其父文件夹向右缩进 但有些事情发生了变化 现在我的子文件夹显示有点像文件资源管理器中的面包屑 请参见下面发布的图片 我尝
  • 将包含日数据的 JFreeChart TimeSeries 系列转换为周或月数据?

    我意识到这可能是一个愚蠢的问题 并且我知道可以通过确定每个数据点所在的周或月等来完成 但是 我正在寻找一种避免编码的方法 如果它是在图书馆中完成的 大概所有的陷阱都得到了 我宁愿使用它 原始数据存储在Excel电子表格中 但我无法直接操作电
  • 输出原始图像流而不是 jpeg,动态调整图像大小

    我有一个 PHP 函数 可以动态调整图像大小以创建缩略图 我遇到了麻烦 因为它只是显示原始图像流而不是实际图像 我的代码使用一个名为缩略图的函数 thumbnail thumbnail item filename 209 137 image
  • PHP date('W') 与 MySQL YEARWEEK(now())

    有人可以解释一下为什么这两个给出不同的结果吗 我用 PHP 执行这个 date YW mktime 0 0 0 3 22 2013 outputs 201312 当我使用 MySQL 执行此操作时 SELECT YEARWEEK now o
  • HTMLUnit:执行速度超慢?

    我一直在使用 HTMLUnit 它非常适合我的要求 但似乎速度极其缓慢 例如 我使用 HTMLUnit 自动化了以下场景 Goto Google page Enter some text Click on the search button
  • Postgresql:带有转义换行符的 CSV 导出

    我使用此处发布的 所有 指令从 postgresql 数据库导出了一些数据 将 PostgreSQL 的 PL pgSQL 输出保存到 CSV 文件 但某些导出的字段包含换行符 换行符 因此我得到了一个 CSV 文件 如下所示 header
  • 调试的最佳实践

    最近 我使用 Visual Studio 和 WinDbg 对托管应用程序进行了大量调试 因此我经常被要求协助同事进行调试 有好几次我发现人们只是到处插入断点并希望得到最好的结果 根据我的经验 这很少是一种有用的技术 我的方法是这样的 重现
  • 通过 GraphQL API 显示超过 100 个条目

    我已经厌倦了使用 github grpahQL API 中的 endCursor 和 hasNextPage 进行分页来获取超过 100 个数据 我使用的查询是 query organization login XXX repository
  • 动态创建的元素上的事件绑定?

    这个问题的答案是社区努力 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 我有一些代码 我循环遍历页面上的所有选择框并绑定 hover事件让他们在宽度上做一些调整mouse on off 这发生在页面准备好并且工作得很好 我遇到的问题
  • 获取调整大小的 html 图像元素的原始尺寸

    有没有一种简单有效的方法来获取显示在 JavaScript 中的图像的真实尺寸 在 JavaScript 中 img 具有可能不同渲染大小的元素 例如 通过max height or max width 有存在naturalWidth an
  • 使用 GraphicsEnvironment 取消注册字体?

    我最近发现了如何向本地 GraphicsEnvironment 注册 TTF 字体 对于我的用例 SVG 到 PNG 转码 Apache Batik 可能会识别该字体 import java awt Font import java awt
  • 运行 ASP.NET Web 应用程序时找不到 System.Runtime 4.1.0.0

    我使用以下projects json 创建了一个可移植类库 supports dependencies Microsoft CSharp 4 0 1 Microsoft NETCore Portable Compatibility 1 0
  • 使用 Visual Studio 在源代码中显示日语字体

    我有一些源文件 其中有用日语写的注释 当我在 Visual Studio 中打开这些文件时 它们显示如下 FNCAP p X b h 我使用的是英文版 WinXP 但是有没有办法让 Visual Studio 显示实际的日语字符而不是当前的
  • 将自定义模型绑定器应用于asp.net core中的对象属性

    我正在尝试为模型的 DateTime 类型属性应用自定义模型绑定器 这是 IModelBinder 和 IModelBinderProvider 的实现 public class DateTimeModelBinderProvider IM
  • 获取与 c# 中的 ProcessStartInfo 一起使用的可用动词(文件关联)列表

    我正在尝试使用 ProcessStartInfo 类打开和打印文件 文件可以是任何内容 但我们假设它是 PDF 文件 ProcessStartInfo pi new ProcessStartInfo file pi Arguments Pa
  • 更改 iOS 中禁用的栏按钮项目的颜色

    我需要在导航栏中显示我的应用程序的图标 为此 我将其添加为右栏按钮项目 我不希望它可点击 我只需要那里的图标 所以我将其设置为禁用 问题是图标显示为灰色 而不是绿色 有没有办法禁用此按钮但又保留其原始颜色 尝试这个 let barButto
  • wcf 测试客户端不支持此操作,因为它使用类型 system.object[]

    您好 在运行我的 wcf 服务时 出现错误 wcf 测试客户端不支持此操作 因为它使用类型 system object 我正在尝试检索正在运行的进程列表 ServiceBehavior InstanceContextMode Instanc
  • Windows UDP 套接字:recvfrom() 失败并出现错误 10054

    大家好 我正在尝试使用 Windows 套接字发送和接收 UDP 数据包 在 C 中 它一直运行良好 直到三天前程序停止正常运行 总结一下情况 当在我的套接字上调用 WSAPoll 时 即使没有启动服务器 它也总是返回用所有可能的 reve
  • 在 Perl 6 中继承私有属性

    我在文档中找不到任何内容 但似乎子类中无法访问其超类的私有变量 我对吗 class A has a class B is A has b method set a x a x my var B new var set a 5 say var