2016-03-30 18 views
0

最初のコマンドライン引数が-1の場合は、特定のクラスのインスタンスの変数を作成し、それ以外の場合はその子クラスのインスタンスを作成するプログラムを作成しています。親クラスと子クラスはすべて同じメソッドとメソッド名を共有しますが、子クラスはその一部の親クラスをオーバーライドします。言い換えれば、宣言後の残りのプログラムは、どのクラスを使用するかにかかわらずまったく同じです。私が現時点で宣言しているのは次のとおりです。if/elseブロック内の変数の宣言

if(args[0].compareTo("-1") == 0){ 
     BST Tree = new BST(); 
    } 
    else{ 
     RBT Tree = new RBT(); 
    } 

後でTreeを参照すると「解決できません」というエラーがスローされます。たくさんの冗長コードなしでこの問題の解決策はありますか?私は明らかにこれらのif/elseブロック内にmain関数全体を置くことができますが、もっと簡潔な解決策があればそれを避けたいと思います。

+1

BSTとRBTはどのように関係していますか?彼らは共通の基本クラスを持っていますか? –

+0

RBTがBSTを拡張しているようです。 – Gendarme

答えて

0

変数をif文のスコープ外に宣言します。

BST Tree; 

if(args[0].compareTo("-1") == 0){ 
    Tree = new BST(); 
} else { 
    Tree = new RBT(); 
} 

これはRBTBSTを拡張することを想定しています。

1

これは、変数Treeもステートメントのスコープ内に宣言しているためです。これらのスコープの外では、Treeは解決できません。

あなたはif文の前にTreeを宣言することができます(それはifブロックの後に可視性を持つように)

BST Tree; 

if(args[0].compareTo("-1") == 0){ 
    Tree = new BST(); 
} else { 
    Tree = new RBT(); 
} 

doSomethingWith(Tree); // Should work fine 
+1

つまり、オブジェクトには到達できません。 – Gendarme

0

ifブロックの前にTreeを宣言します。同様に、

BST Tree; 
if(args[0].compareTo("-1") == 0){ 
    Tree = new BST(); 
} 
else{ 
    Tree = new RBT(); 
} 

または私はクラス名のように見えた(Treetreeを好むのでまた

BST Tree = (args[0].compareTo("-1") == 0) ? new BST() : new RBT(); 

のような三元を使用して、慣例により、Javaの変数名は小文字で始まります)。