2010-12-08 25 views
0

私はベースクラス "Shapes"と拡張クラス "Circle"を持っています。どちらもgetNameメソッドを持っています。 私のテストクラスは「ドライバ」クラスです。Javaアップキャストスコープ解決の問題

サークルオブジェクトをシェイプにアップキャストし、それをpolyTestという関数に渡します。 その関数ではgetNameを呼び出す必要がありますが、getオブジェクトのcircleオブジェクトの実装をトリガーするのではなく、基本クラスの実装をトリガーする必要があります。

super.getName()は機能しません。

私のコードは以下のとおりです。

public class Driver{ 
    public static String polyTest (Shapes s){ 
     return s.getName(); 
     /*Instead of s.getName()... (gives me the Circle class implementation of getName()) 
     I want to call s.Shapes::GetName, the base class implementation of getName. */ 
    } 

    public static void main(String[] args){ 
     Circle c = new Circle(); 

     //Test Basic inheritance & basic polymorphism. 
     //System.out.print(c.getName()); 

     //Upcast test. 
     Shapes s = (Shapes) c; 
     System.out.print(polyTest(s));  
    } 
} 

public class Circle extends Shapes{ 
    Circle(){ 
     super(); 
    } 

    public String getName(){ 
     return "I am a Circle"; 
    } 
} 

public abstract class Shapes{ 
    Shapes(){ 
    } 

    public String getName(){ 
     return "I am a Shape"; 
    } 
} 
+1

デザインに何か問題があるように見えます。ところで、Shapesにアップキャストする必要はありません。何をしたいですか? – khachik

答えて

5

これは多形性Javaが動作する方法と同じですが、私は恐れています。仮想メソッド呼び出しは、メソッド自体(super.getName()と呼ぶことができます)の外で仮想的に実行するよう強制することはできません。それを行う能力は、カプセル化を破ることになります。例えば、クラスは、superメソッドを呼び出す前に、オーバーライドされたメソッドで特定の方法で引数を検証することができます。もし回避でき、最初の場所でメソッドをオーバーライドするという全目的に違反することになります。

が特定の実装を呼び出す必要がないようにコードを再設計する必要があります。ポリモーフィズムのポイントは、呼び出し側が事前にその実装が何であるかを知ることなく、サブクラスが動作を特殊化できるようにすることです。

もちろん、メソッドをオーバーライドできないようにするには、そのメソッドを最後にすることができます。

+0

[引用]もしあなたがそのことを知り、「私は元の実装を呼びたいだけです」と言うなら、最初にメソッドをオーバーライドするという全目的に違反するでしょう。[/引用]私は基本実装を使用するために、元の実装へのアクセスを失うかどうかをgetNameにオーバーロードさせるかどうかを知りたいだけでした。 C++では、オーバーライドしても、継承した実装へのアクセスが失われるわけではありません。 Circle srcファイルでorig実装にアクセスできますが、その外にはありません...オーバーライドされたimplで悩まされているようです。 Javaで。どうも。 – user440297

+0

申し訳ありませんが、返信に文字がなくなりました。だから、これは実際にJavaの場合ですか?あなたがオーバーライドされた実装で悩まされている場合はオーバーライドしますか? – user440297

+0

@ user440297:はい。それがJavaで多態性がどのように機能するかです。 –

0
  1. アップキャストする必要はありませんCircleShapesです。 (ShapesCircle
  2. Circleクラスが独自のgetNameメソッドを実装しないようにするには、オーバーライドしないでください。
  3. getNameメソッドを他の方法でオーバーライドする必要がある場合は、getNameInSomeContextをクラスに追加し、必要に応じて派生クラスでオーバーライドすることができます。
+0

1.私はそれをアップキャストする必要はないことを知っている、私は私の継承された実装を斧できるかどうかを確認しました。 oopを持つprobは、全能でない生き物がコードを書いている...基本実装へのアクセスがなくなったかどうかを見たいと思っていました。 – user440297