2012-02-10 26 views
0

私はクラス私のメソッドにアクセスできないのはなぜですか?

public abstract class BoardLocation 
{ 
    //... 
} 

と別のものを持っている...

public abstract class Property extends BoardLocation 
{ 
    public abstract int getRentAmt(); 
} 

と私のDriver.javaで最終的に、別の...

public class Lot extends Property 
{ 
    @Override 
    public int getRentAmt() 
    { 
     //... 
    } 
} 

私がやっています..

BoardLocation board[] = new BoardLocation[2]; 
board[0] = new Lot(); 
board[1] = new Lot(); 

私が呼び出すしようとするけど...

board[0].getRentAmt(); 

私は「シンボルが見つかりません」という取得し、それはボードが[0] BoardLocationであると述べています。

これはなんらかの理由がありますか?または何かの修正?

答えて

2
  • あなたがBoardLocationに、その方法、.getRentAmtを追加する必要があります。多分それをインターフェイスにする。
  • 別のオプションは、[0]ロットまたはプロパティに、そしてあなたの実際の問題が悪いOOP設計であるgetRentAmt
+0

私はキャスティングを試みましたが、それは動作しませんでした。 BoardLocationをインターフェイスにしたいですか? – Mike

+0

コードとエラーが表示されます。私はボードの場所をインターフェイスにします。 – Adrian

1

配列の要素の静的型はBoardLocationです。 getRentAmt()はこのタイプには定義されていません。個々の要素は実際にはもっと特殊化されているかもしれませんが、スーパークラス参照を介して、スーパータイプで宣言されたメソッドに制限されています。

このメソッドへのコンパイルアクセスが必要な場合は、配列をより特殊な型(Property[])にするか、メソッドをスーパークラスに移動する必要があります。さらなる情報を含めると、他のオプションが表示されることがあります。

+0

どうすればこの問題を解決できますか? – Mike

1

クラスでgetRentAmt()メソッドが宣言されていないためです。あなたの要素タイプはBoardLocationであり、コンパイラはあなたの配列にLotが実際にあることを知らない。コンパイラはBoardLocationの配列を持っていることを認識しています。getRentAmt()メソッドを使用する場合は、BoardLocationに宣言し、継承したクラスでオーバーライドする必要があります。

+0

これを修正する方法はありますか? – Mike

+0

私は私の答えを編集しました)) – shift66

0

BoardLocationはPropertyで宣言されたメソッドを知らない! 試してみてください。

Property board[] = new Property[2]; 
board[0] = new Lot(); 
board[1] = new Lot(); 
0

を呼び出すボードをキャストすることです。解決しようとしていることを再度定義し、インターフェースを使用して検討してください。

+0

このリンクをご覧ください。それはあなたのために物事をより明確にするかもしれません: [link](http://www.codestyle.org/java/faq-Abstract.shtml) – gefrag

関連する問題