2016-03-23 10 views
0

Also ich versuche, eine Reihe von Datentypen, die Person in einer Datei untergegliedert sind. Der folgende Code hat keine Kompilierungsfehler, aber wenn ich eine andere Datei zum Testen des Codes erstelle, wird er nicht kompiliert, weil er sagt, dass alle Subtypen nicht deklariert sind.Subtyping in einer einzigen Datei 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 { 

     } 
} 

Dies ist die Testklasse, und es zeigt die roten Linien unter Lehrer, Professor, und TeachingAssistant. Ich verstehe nicht, warum es nicht funktioniert.

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); 

    } 
} 

Ich bekomme es wirklich nicht, kann jemand helfen?

+0

Sie benötigen eine Instanz der abstrakten Klasse, um Ihre ** inneren ** Klassen zu instanziieren. Und seltsamerweise ist "Professor" keine "Person". –

Antwort

5

Keine der inneren Klassen tatsächlich erweitert Person; Sie leben zufällig in der Person Klasse.

Sie müssen explizit a) machen Sie Ihre inneren Klassen static, b) haben sie erweitern Person, c) beziehen sich auf sie qualifiziert, z. 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

Und 'Person.Professor' sieht nicht halb komisch aus, was bedeutet, dass dies aus Sicht der OOP nicht die beste Art von Design ist. – biziclop

+0

Sollte der Lehrer nicht eine innere statische Schnittstelle sein? Verwenden als "implementiert Person.Teacher". –

+2

@AlissonVieira innere Schnittstellen sind automatisch statisch und Sie müssen Referenzen zu anderen inneren Klassen derselben Klasse nicht explizit qualifizieren. –

Verwandte Themen