まず第一に、いくつかの無規定の要件があります。
VariableType
はクラスやインターフェイスである必要があり、
VariableType var = new ObjectType();
ObjectType
は、適切なコンストラクタを持つ非抽象クラスでなければならない、と
ObjectType
は、直接的または間接的である必要があります。この文のためにコンパイルしますサブタイプはVariableType
です。
これらの要件のいずれかが満たされない場合、上記のステートメントはコンパイルされません。
あなたの疑問にお答えします。
はdoStuff(IF [このコードをコンパイルすることが保証されている])VariableType
真のメンバ関数です。コンパイラは、メソッドがVariableType
によって提供されるAPIに存在するかどうかをチェックします。そうです。
doStuffは()のObjectType
偽のメンバ関数である場合、[このコードはコンパイルすることが保証されています]。 doStuff()
がObjectType
に定義されていて、VariableType
に定義されていない場合、呼び出しはコンパイルされません。
この例では実行時にメソッドが存在しますが、コンパイラではvar
に割り当てることのできるすべての値に対してメソッド呼び出しが機能することが必要です。いくつかの可能な値は、VariableType
自体のインスタンス、またはVariableType
のいくつかの他のサブクラスであってもよいdoStuff()はVariableTypeのスーパー
真のメンバ関数である場合、[このコードはコンパイルすることが保証されています]。 doStuff()
がVariableType
のスーパークラスで定義されている場合、VariableType
とそのクラスの一部に継承されます。
doStuffは()のObjectTypeのスーパー
偽のメンバ関数である場合、[このコードはコンパイルすることが保証されています]。 ObjectType
がA
に拡張され、A
がVariableType
に拡張され、VariableType
がdoStuff
メソッドを定義しない場合を考えます。
このシナリオでは、A
にはdoStuff()
メソッドがあることに違いはありません。このメソッドはAPIのVariableType
で公開されていないため、そのように呼び出すことはできません。
VariableType型の変数で*呼び出す場合、メソッドはVariableType、それが拡張するスーパークラス、または実装するインタフェースで*宣言*する必要があります。 –
クラスVariableTypeとObjectTypeを作成してから、問題の定義に従っていずれかのクラスでdoStuff()を実装し、それらがコンパイルされているかどうかを確認してください。そういうわけで、私は何がうまくいくのかわかりません。その後、そこからさらに調査することができます。 –
質問はメンバー関数の*呼び出し*がいつ*コンパイルされるかについてです。彼らが走れるときではない。 – EJP