2

Java OOPで何かをしてからしばらく経ちましたので、少し錆びていて、説明が必要でした。

Javaでは、私が正しく覚えていれば、スーパークラスを宣言してサブクラスをインスタンス化することができます。たとえば、Superclass myObject = new Subclass()

次に、myObjectをスーパークラスパラメーターを受け入れる関数に渡し、参照を使用してスーパークラスのプロパティ/メソッドにアクセスできます。

ここで問題が発生します-サブクラス固有のメソッド/変数にアクセスする場合は、myObject(スーパークラスとして宣言されています)を使用して直接アクセスできますか、それとも最初にサブクラスタイプにキャストする必要がありますか?

これをC#にロールオーバーすると、同じロジックが適用されますか?この動作を複製しようとすると、いくつかの奇妙な問題が発生します。私が見ている特定のユースケースは次のとおりです。

//These are just declarations for ease-of-reading
Superclass bar = new Subclass();
public static void doSomething(Superclass foo) {...}

//Logic
doSomething(bar);
bar.superOnly() //Should this work?
bar.subOnly() //Should this work?
bar.subOverrided() //Will this call the superclass or subclass version?

私はチュートリアルでもこの​​ようなものを調べていますが、ほとんどの例は、簡単な出力を持つ単純な「Subclass myObject = newSubclass()」インスタンスのようです。私がこれまでに見つけたものは、関数パラメーターのあいまいな世界をカバーしていません。

誰かが私を助けてくれるか、C#の関数パラメーターとOOをカバーする特定のリソースを教えてくれるなら、私はそれを大いに感謝します!

4

4 に答える 4

3

必要な機能を取得する 2 つの方法。

1) オブジェクトをサブクラスにキャストします
。 2) オブジェクトを最初からサブクラスとしてインスタンス化します。

第一に、Collectionが何をするかわからないがある場合ArrayList、 のメソッドを呼び出すことは不可能ですArrayList

Collection collection = new ArrayList(); 

2 番目の例:

ArrayList list = new ArrayList();  

上記により、公開されているすべてのもの (親クラス/インターフェイスから共有されているもの) と、内部で宣言されているすべてのものにアクセスできます。ArrayList

于 2012-05-25T19:30:25.133 に答える
3

サブクラス固有のメソッド/変数にアクセスしたい場合、(スーパークラスとして宣言された) myObject で直接アクセスできますか、それとも最初にサブクラス型にキャストする必要がありますか?

はい、それがポリモーフィズムの目的です。派生クラスでオーバーライドされる基本クラスの仮想メソッドは、基本型の参照を通じてメソッドを呼び出す場合でも、常に呼び出されます。

これを C# にロールオーバーすると、同じロジックが適用されますか?

はい、原理は同じです

あなたの例については:

bar.superOnly() //Should this work?

はい

bar.subOnly() //Should this work?

いいえ、コンパイラはこのメソッドを認識しないためです

bar.subOverrided() // Will this call the superclass or subclass version? => the subclass

はい、ポリモーフィズムのおかげで

于 2012-05-25T19:32:34.307 に答える
2

C# と Java の両方で、ルールはかなり一貫しています。

使用できるインターフェイスを決定する特定の型の変数を宣言します。宣言された型は、変数の前の型名です。宣言された型の一部として定義されたメソッドのみを (キャストなしで) 使用できます。

対照的に、定義は、宣言された型、または宣言された型の任意のサブクラスまたは実装にすることができます。定義は、その変数を介して利用できるインターフェースを変更するのではなく、その変数の実装を定義します。オブジェクト変数の定義は、それに割り当てられた値 (右側) であり、通常はnew.

変数の宣言された型は、他の型にキャストすることによってのみ変更できます。これは、成功する場合と失敗する場合があります (コンパイラーは、キャストが有効かどうかを必ずしも認識しません)。

于 2012-05-25T19:37:31.467 に答える
2

サブクラスでのみ宣言されているメソッドを呼び出したい場合は、変数をサブクラスにキャストするか、サブクラス型の変数で開始する必要があります。

サブクラスでオーバーライドされたメソッドを呼び出したい場合は、スーパークラス変数を介して呼び出すことができ、サブクラスのバージョンが呼び出されます。

于 2012-05-25T19:34:18.830 に答える