2016-03-23 15 views
0

私は1つのファイル内のpersonにサブタイプ化された一連のデータ型を作成しようとしています。次のコードにはコンパイルエラーはありませんが、コードをテストする別のファイルを作成すると、すべてのサブタイプが宣言されていないためコンパイルされません。単一ファイル内のサブタイプJava?

package people; 


public abstract class Person { 
     public interface Teacher { 

     } 
     public class Professor implements Teacher { 

     } 

     public class Student { 

     } 

     public class TeachingAssistant extends Student implements Teacher { 

     } 
} 

これはテストクラスで、Teacher、Professor、およびTeachingAssistantの下に赤い線が表示されます。私はなぜそれが機能していないのか理解していない。

package people; 

/** 
* 
* @author Alex 
*/ 

public class Edutypes { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     // TODO code application logic here 
     testTypes(); 
    } 

    public static void testTypes() { 
     Person a = new Professor(), b=new Student(), c=new TeachingAssistant(); 
     System.out.println(a); 
     System.out.println(b); 
     System.out.println(c); 
     Teacher d = new Professor(), e=new TeachingAssistant(); 
     System.out.println(d); 
     System.out.println(e); 

    } 
} 

私は本当にそれを得ることはできません、いくつかの助けができますか?

+0

** inner **クラスをインスタンス化するには、抽象クラスのインスタンスが必要です。そして、奇妙なことに、「教授」は「人」ではない。 –

答えて

5

実際に内部クラスはどれも伸びませんPerson;彼らはちょうどPersonクラスに住んでいます。

明示的にa)内部クラスstaticを作成し、b)それらをPersonに拡張する必要があります。c)修飾されたものを参照してください。 Person a = new Person.Professor()

public static class Professor extends Person implements Teacher { 

    } 

    public static class Student extends Person { 

    } 

    public static class TeachingAssistant extends Student implements Teacher { 

    } 
+1

'Person.Professor'は半分奇妙に見えません。これは、これがOOPの観点から最高のデザインではないかもしれないことを示唆しています。 – biziclop

+0

Teacherを内部静的インターフェースにするべきではありませんか? "Person.Teacherを実装する"として使用する。 –

+2

@AlissonVieiraの内部インターフェイスは自動的に静的であり、同じクラスの他の内部クラスへの参照を明示的に修飾する必要はありません。 –

関連する問題