0

'SubClass'が'SuperClass'を拡張する場合、そのメソッドとプロパティを継承すると、'SuperClass'とは異なるメソッドとプロパティが作成されますか?

または、「SubClass」のインスタンスを作成し、「SuperClass」から継承されたプロパティを変更しようとすると、スーパークラスのプロパティも変更しますか?

ありがとう。

編集

package {

    public class SubClass extends SuperClass {

        public function SubClass() {
            trace('superclass value n='+superClass.n+'\n');
            trace('subclass changes inherited n'+'\n');
            n = 3;
            trace('subclass value n='+n+'\n');
            trace('superclass value n='+superClass.n+'\n');
        } 
    } 
} 

私を返します:

superclass value n=-1;
subclass changes inherited n;
subclass value n=3;
superclass value n=3;
4

2 に答える 2

2

簡単に説明します。

サブクラスとスーパークラスの2つのクラスがあります。

SuperClassには4つのメソッドがあります。

  • プライベート関数methodPrivate():void;
  • 保護された関数methodProtected():void;
  • パブリック関数methodPublic():void;
  • 内部関数methodInternal():void;

サブクラスからあなた:

  1. methodPrivate():voidにアクセスできません。
  2. methodProtected():voidにアクセスできます。ただし、プライベートメソッドと同様に、サブクラスの外部からアクセスすることはできません。
  3. methodPublic():voidにアクセスできます。サブクラスの外部からもすべてにアクセスできます。
  4. methodInternal():void; SuperClassのパッケージからクラスに利用できます。

ただし、これらのメソッドをオーバーライドすることはできます。オーバーライドしてもSuperClassのメソッドは変更されませんが、SubClassでのみ変更されます。

override public function methodPublic() : void {
    // your additional code
    super.methodPublic(); // eventually calling the same method of SuperClass, you can pass arguments to it also
}

ご存知のように、SuperClassには変数を含めることもできます。変数は、パブリック、プロテクト、プライベート、または内部にすることもできます。それらをオーバーライドすることはできませんが、ゲッターまたはセッターを使用してオーバーライドできます。

次のような「super」という単語を使用して、パブリックまたは保護として作成された変数にアクセスできます:super.someVariable。

したがって、SuperClassとSubClassで同じ名前の異なる変数を作成する場合は、SuperClassでプライベートとして宣言するだけです。SuperClassとSubClassの両方がアクセスできる1つの変数が必要な場合は、保護またはパブリックとして宣言するだけです。

それが明確だったことを願っています。

于 2012-06-01T21:56:49.223 に答える
1

空白のサブクラスを作成してスーパークラスを拡張すると、親クラスに同じインターフェイス(同じ実装)を提供する新しいクラスが作成されます。

つまり、親クラスにメソッドが含まれている場合doSomething、サブクラスは実際にそれを記述しなくても、doSomethingメソッドも使用できるようになります。これに対する1つの注意点は、メソッドがマークさprivateれている場合です。この場合、継承クラスであるSubClassはアクセスできません。

package {

    public class SuperClass {

        public function SuperClass():void {
            self.doSomething();
        }

        public function doSomething():void {
            trace("doing something");
        }
}


package {

    import SuperClass;

    public class SubClass extends SuperClass {

        public function SubClass():void {}
    }
}

この関係を確立したらdoSomething、SubClassのインスタンスの呼び出しが、SuperClassで定義されているデフォルトの実装とは異なる動作をするかどうかを決定できます。同じ動作が必要な場合は、そのままにしておきます。別の動作が必要な場合は、キーワードを使用して親クラスのメソッドをオーバーライドしますoverride

package {

    import SuperClass;

    public class SubClass extends SuperClass {

        public function SubClass():void {}

        override public function doSomething():void {
            trace("doing another thing instead");
        }
    }
}

doSomethingこれで、SubClassのインスタンスを呼び出すものは、変更された動作を取得します。ただし、デフォルトの実装には変更が加えられていません。SuperClassのインスタンス化は、このメソッドのオーバーライドによって変更されません。サブクラスのインスタンスのみが影響を受けます。

これは、プロパティの場合と同じです。

これには1つの例外があり、それは静的プロパティです。静的プロパティは、クラスのインスタンスではなく、クラスのプロパティです。静的プロパティは継承されません。静的プロパティは次のようになります。

package {

    public class SuperClass {

        public static var i:int = 0;

        public function SuperClass():void {
        }

        public function doSomething():void {
            trace("doing something");
        }
}

SubClassクラスには、静的プロパティiへの参照はありません。ただし、SubClassインスタンスは、SuperClassの静的な値を変更できます。例として:

package {

    import SuperClass;

    public class SubClass extends SuperClass {

        public function SubClass():void {}

        override public function doSomething():void {
            trace("changing something in SuperClass");
            SuperClass.i = 1;
        }
    }
}

現在、SuperClassの静的変数iの値は0ではなく1です。このように、SubClassには、SuperClassのプロパティを変更する可能性があります(ただし、コードが適切なアクセス権を持っている場合と同じ可能性があります)。

これがお役に立てば幸いです。

于 2012-06-01T21:26:10.087 に答える