gpt4 book ai didi

constructor - Perl6 : Constructors in subclases

转载 作者:行者123 更新时间:2023-12-04 19:30:02 27 4
gpt4 key购买 nike

有没有办法从子类中的构造函数分配在父类(super class)中声明的实例变量?我已经习惯使用 BUILD() 作为构造函数,但我想知道这是否是个好主意。 IE:

use v6;      

class File
{
has $!filename;
}

class XmlFile is File
{
submethod BUILD(:$!filename)
{
}
}

my XmlFile $XF = XmlFile.new(filename => "test.xml");

上面的代码不起作用,提示错误:“Attribute $!filename not declared in class XmlFile”。是使用正确的访问器的问题吗?改变“!”到 ”。”不能解决问题。

最佳答案

你已经成功了一半。您必须对代码进行正确的两项更改:

class File {
has $.filename; # 1. Replace `!` with `.`
}

class XmlFile is File {
submethod BUILD(:$filename) { } # 2. Remove `!`
}

dd my XmlFile $XF = XmlFile.new(filename => "test.xml");

# XmlFile $XF = XmlFile.new(filename => "test.xml")

更换 $!filename$.filenameFile类在该类中生成一个公共(public)访问器方法( .filename)。

(请注意,从技术上讲,属性对于一个类始终是私有(private)的,即对于其他类始终不可用,甚至是 trusted 类。当您看到短语“公共(public)属性”时,它实际上意味着有一个“公共(public)访问器”控制对相应底层的访问私有(private)属性。)

删除 !来自 BUILD 的 Twig XmlFile中的签名类意味着你不再试图引用一个不存在的 XmlFile属性,而只是传递一个命名参数。

根据 Object Construction :

Due to the default behavior of BUILDALL and BUILD submethods, named arguments to the constructor new derived from Mu can correspond directly to public attributes of any of the classes in the method resolution order, or to any named parameter of any BUILD submethod.



(“公共(public)属性”用词不当。它的意思是“具有匹配公共(public)访问器的属性”。)

关于constructor - Perl6 : Constructors in subclases,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44547759/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com