2016-09-04 14 views
1

Genieクラスの継承を理解しようとしていますが、私はPetクラスのプロパティを継承することになっている2つのクラス(KittenとPuppy)を作成しました。目的はminouに吠えるように求めることですが、_nameは子クラスの範囲外であるようです。どのようにこのプロパティを子クラスに渡すのですか?ここでGenieクラスの継承

は、コードは次のとおりです。

[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!" 
+0

あなたは、単に私が固定されたタイプミスしていた、私は今取得していますエラーメッセージを追加しました。解決策は、privateではなく '_name'を保護することです。 –

+0

しかし、Genieクラスの保護された/パブリックメンバーの構文はわかりませんが、これは制限事項であり、bugzilla.gnome.orgに報告する必要があります –

答えて

2

あり相続に関連するインターネット上のチュートリアルがたくさんあり、彼らはしばしば動物や部品を使用して、複雑な階層を作成しますの車両。概念的には、これらの継承階層は厳密なものであるため、コンストラクタ内でのコラボレーションオブジェクトの継承(継承での合成を優先させる)と、インタフェースに対する共同作業者の型チェック(ポリモーフィズム)がよくあることがよくあります。これにより分離されたオブジェクトが作成され、プログラムの柔軟性、保守性、テスト容易性が向上します。したがって、継承について学ぶだけでなく、重要な視点からそうすることもできます。

Genieはサブタイプと継承をサポートしています。あなたのプログラムには2つの問題があります。最初はスコープで、2番目はコンストラクタのチェーンの上にパラメータを渡します。

最初に範囲の問題。 Genieのアンダースコアは、クラスメンバーがプライベートであることを示します。このクラスのインスタンスによってのみアクセスできます。サブタイプからコンピュータ言語にアクセスするには、protectedアクセス修飾子を使用します。これは現在、Genieパーサーでは実装されていません。 Bug 690848 - Add support for "protected" class membersを参照してください。ですから、nameフィールドを公開する必要があります。これにより、サブタイプからアクセスすることができますが、Petのインスタンスがスコープ内にあるプログラムの任意の部分からアクセスすることもできます。 Genieでは、アンダースコアを削除して公開します。

スコープが有効になったら、「引数を必要とするベースコンストラクタにチェーンできません」というエラーが発生します。あなたのサブタイプのコンストラクタを追加する必要があり、これらのコンストラクタはnameフィールドを設定する必要があります。これは直接行うことができる。 name = pet_name、または適切な引数を持つスーパータイプのコンストラクタを呼び出すなどして、 super(pet_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!" 
1
[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")