首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Genie中的类继承

Genie中的类继承
EN

Stack Overflow用户
提问于 2016-09-04 10:37:50
回答 2查看 140关注 0票数 1

为了理解Genie中的类继承,我创建了两个类(Kitten和Puppy),它们应该继承Pet类的属性。其目的是让minou叫和duke叫,但是_name似乎超出了子类的范围。如何将此属性传递给子类?

代码如下:

代码语言:javascript
复制
[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()

错误消息为:

代码语言:javascript
复制
Test78.gs:16.15-16.24: error: Access to private member `Pet._name' denied
        print self._name + " meowed!"
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-04 20:08:27

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

Genie确实支持子类型和继承。您的程序会遇到两个问题。第一个是作用域,第二个是在构造函数链上传递参数。

首先是范围问题。Genie中的下划线表示类成员是私有的。它只能由该类的实例访问。要允许从子类型计算机语言访问它,请使用protected访问修饰符。这目前还没有在Genie解析器中实现。参见Bug 690848 - Add support for "protected" class members 。因此,我们必须将name字段设置为公共字段。这允许从子类型访问它,但也可以从程序的任何部分访问Pet实例所在的范围。在Genie中,我们只需删除下划线即可将其公开。

一旦你的作用域工作了,你就会得到一个错误:"unable to chain up to base constructor arguments“。您将需要添加子类型的构造函数,并且这些构造函数需要设置name字段。这可以直接完成,例如name = pet_name,或者通过使用正确的参数调用超类型的构造函数,例如super( pet_name )。下面是一个显示这两种方法的工作示例:

代码语言:javascript
复制
[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!"
票数 2
EN

Stack Overflow用户

发布于 2016-12-27 19:53:27

代码语言:javascript
复制
[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")
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39313072

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档