1

Genie のクラス継承を理解しようとして、Pet クラスからプロパティを継承することになっている 2 つのクラス (Kitten と Puppy) を作成しました。ミノウにニャー、デュークに吠えさせるのが狙いなのですが、_nameは子クラスの対象外のようです。このプロパティを子クラスに渡す方法は?

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

[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!"
4

2 に答える 2

2

継承に関連するチュートリアルがインターネット上に多数あり、動物や乗り物の一部を使用して複雑な階層を作成することがよくあります。概念的には、これらの継承階層は固定的です。そのため、共同作業するオブジェクトをコンストラクターに渡し (継承よりも構成を優先)、インターフェースに対して共同作業者の型をチェックする (ポリモーフィズム) 方がよい場合がよくあります。これにより、分離されたオブジェクトが作成され、プログラムの柔軟性、保守性、およびテスト容易性が向上します。したがって、継承について学びますが、批判的な観点からも学びましょう。

Genie は、サブタイピングと継承をサポートしています。プログラムで 2 つの問題が発生します。1 つ目はスコープで、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!"
于 2016-09-04T12:08:26.707 に答える