Inheritance Genie中的类继承

Inheritance Genie中的类继承,inheritance,vala,genie,Inheritance,Vala,Genie,为了理解Genie中的类继承,我创建了两个类(Kitten和Puppy),它们应该继承Pet类的属性。其目的是让米努喵喵叫,让杜克吠叫,然而,这个名字似乎不在儿童课程的范围之内。如何将此属性传递给子类 代码如下: [indent=4] // Experimenting with classes in Genie class Pet _name:string construct ( name:string? ) _name = name class Ki

为了理解Genie中的类继承,我创建了两个类(Kitten和Puppy),它们应该继承Pet类的属性。其目的是让米努喵喵叫,让杜克吠叫,然而,这个名字似乎不在儿童课程的范围之内。如何将此属性传递给子类

代码如下:

[indent=4]

// Experimenting with classes in Genie

class Pet

    _name:string

    construct ( name:string? )

        _name = name

class Kitten : Pet

    def meow()
        print self._name + " meowed!"

class Puppy : Pet

    def bark()
        print self._name + " barked!"

init
    var minou = new Kitten("Minou")
    var duke = new Puppy("Duke")

    minou.meow()
    duke.bark()
错误消息是:

Test78.gs:16.15-16.24: error: Access to private member `Pet._name' denied
        print self._name + " meowed!"

互联网上有很多与继承相关的教程,它们通常使用动物或车辆部件创建复杂的层次结构。从概念上讲,这些继承层次结构是严格的,这就是为什么在构造函数中传递协作对象(支持组合而不是继承)和根据接口(多态性)检查协作者的类型通常更好的原因。这将创建解耦对象,并允许程序具有更大的灵活性、可维护性和可测试性。所以,学习继承,但也要从批判的角度来学习

精灵确实支持子类型和继承。您的程序遇到两个问题。第一个是范围,第二个是向构造函数链上传递参数

首先是范围问题。精灵中的下划线表示类成员是私有的。它只能由该类的实例访问。要允许从子类型计算机语言访问它,请使用
protected
access修饰符。这在Genie解析器中目前没有实现。看见因此,我们必须公开
名称
字段。这允许从子类型访问它,也允许从程序的任何部分访问它,其中
Pet
的实例在范围内。在精灵中,我们只是删除下划线以使其公开

一旦作用域正常工作,就会出现一个错误“无法链接到需要参数的基本构造函数”。您需要为子类型添加构造函数,这些构造函数需要设置
名称
字段。这可以直接完成,例如
name=pet\u name
,或者使用正确的参数调用super类型的构造函数,例如
super(pet\u name)
。下面是一个显示这两种方法的工作示例:

[indent=4]
init
    var minou = new Kitten( "Minou" )
    var duke = new Puppy( "Duke" )
    minou.meow()
    duke.bark()


class Pet
    name:string

    construct( pet_name:string = "Anonymous" )
        name = pet_name


class Kitten:Pet
    construct( pet_name:string = "Anonymous" )
        name = pet_name

    def meow()
        print name + " meowed!"


class Puppy:Pet
    construct( pet_name:string = "Anonymous" )
        super( pet_name )

    def bark()
        print name + " barked!"

你有一个简单的打字错误,我修正了,我添加了我现在收到的错误信息。解决方案是将
\u name
设置为受保护而不是私有。但是我不知道精灵类中受保护/公共成员的语法,也许这是一个限制,应该向bugzilla.gnome.org报告
[indent=4]

class Pet

    prop  name:string

class Kitten : Pet

    def meow(name : string)
        print self.name + " meowed!"

class Puppy : Pet

    def bark(name : string)
        print self.name + " barked!"

init
    var minou = new Kitten()
    var duke = new Puppy()

    minou.meow(minou.name="Minou")
    duke.bark(duke.name="Duke")