2016-04-04 4 views
-2

を実行することができ、そして私は、コードがコンパイルされている例を見つけることになってるとき:このコードはコンパイルすることが保証されてAPコンピュータサイエンス:メンバ関数は、だから私は次のコード与えられてい

VariableType var = new ObjectType(); 
var.doStuff(); 

(すべての該当するものを選択する)場合:

  • doStuff()VariableType
  • のメンバ関数である
  • doStuff()のObjectType
  • doStuff(のメンバ関数である)VariableTyのメンバ関数でありますPEのスーパー
  • doStuff()私は本当に他のケースでも動作しないかどうかわからないが、私はマークだけが、二番目だったのObjectTypeのスーパー

のメンバ関数です。問題への答えもありません。私は多少困惑しています。だから、皆さんの誰かがそれぞれのケースを説明して、なぜ彼らが働くのか、うまくいかないのか、それが大いに役立つでしょう。

+2

VariableType型の変数で*呼び出す場合、メソッドはVariableType、それが拡張するスーパークラス、または実装するインタフェースで*宣言*する必要があります。 –

+1

クラスVariableTypeとObjectTypeを作成してから、問題の定義に従っていずれかのクラスでdoStuff()を実装し、それらがコンパイルされているかどうかを確認してください。そういうわけで、私は何がうまくいくのかわかりません。その後、そこからさらに調査することができます。 –

+0

質問はメンバー関数の*呼び出し*がいつ*コンパイルされるかについてです。彼らが走れるときではない。 – EJP

答えて

1

まず第一に、いくつかの無規定の要件があります。

  • VariableType
  • はクラスやインターフェイスである必要があり、

    VariableType var = new ObjectType(); 
    
    1. ObjectTypeは、適切なコンストラクタを持つ非抽象クラスでなければならない、と
    2. ObjectTypeは、直接的または間接的である必要があります。この文のためにコンパイルしますサブタイプはVariableTypeです。

    これらの要件のいずれかが満たされない場合、上記のステートメントはコンパイルされません。

    あなたの疑問にお答えします。

    はdoStuff(IF [このコードをコンパイルすることが保証されている])VariableType

    真のメンバ関数です。コンパイラは、メソッドがVariableTypeによって提供されるAPIに存在するかどうかをチェックします。そうです。

    doStuffは()のObjectType

    偽のメンバ関数である場合、[このコードはコンパイルすることが保証されています]。 doStuff()ObjectTypeに定義されていて、VariableTypeに定義されていない場合、呼び出しはコンパイルされません。

    この例では実行時にメソッドが存在しますが、コンパイラではvarに割り当てることのできるすべての値に対してメソッド呼び出しが機能することが必要です。いくつかの可能な値は、VariableType自体のインスタンス、またはVariableType

    のいくつかの他のサブクラスであってもよいdoStuff()はVariableTypeのスーパー

    真のメンバ関数である場合、[このコードはコンパイルすることが保証されています]。 doStuff()VariableTypeのスーパークラスで定義されている場合、VariableTypeとそのクラスの一部に継承されます。

    doStuffは()のObjectTypeのスーパー

    偽のメンバ関数である場合、[このコードはコンパイルすることが保証されています]。 ObjectTypeAに拡張され、AVariableTypeに拡張され、VariableTypedoStuffメソッドを定義しない場合を考えます。

    このシナリオでは、AにはdoStuff()メソッドがあることに違いはありません。このメソッドはAPIのVariableTypeで公開されていないため、そのように呼び出すことはできません。

    1

    コンパイラがメソッド呼び出しを認識すると、メソッドが呼び出されるタイプの変数または式のが宣言されます。この場合、変数はvarであり、宣言された型はVariableTypeです。したがって、VariableTypeまたはそのスーパータイプで宣言されたメソッドのみが呼び出される可能性があります。

    VariableType var = new ObjectType();の割り当ては、ObjectTypeVariableTypeのサブクラスである場合にのみコンパイルされることに注意してください。そうですね。しかし、答えは変わりません。ObjectTypeで宣言されているメソッドは、 "visible through" VariableTypeではありません。メソッドがスーパークラスObjectTypeで宣言されていても、そのスーパークラスはまだのサブクラスである可能性があります。たとえば、class FooType extends VariableTypeclass ObjectType extends FooTypeの場合です。

    このすべての目的は、コンパイルされた呼び出しが実行時に成功することを保証することです。 var.methodThatOnlyExistsInObjectType()をコンパイルすると、実行時にvarが実際にObjectTypeを参照していないと失敗します。

    関連する問題