2015-03-02 31 views
5

Mam klasy o nazwie Test i klasę o nazwie SubTest który rozciąga Text, chciałbym mieć metodę w klasie Test kto woli zwraca instancję SubTest kiedy nazywa, chciałbym jak to zrobić:Jak Metoda Nadklasa zwraca instancję podklasy

SubTest test = new SubTest().setTest("Hello!").setOtherTest("Hi!"); 

w setTest() i setOtherTest() metody powinny być w klasie Test.

Ale kiedy zrobić:

public Test setTest(String test) { return this; } 

Zwraca jedynie wystąpienie Test więc mam do oddania Test do SubTest, ale ja nie chcę.

Czy to możliwe? Jeśli tak, w jaki sposób?

Dzięki, MinusKube.

+0

Czy twoja klasa "Testowa" będzie "abstrakcyjna"? –

Odpowiedz

7

Mając to metoda zwraca jego właściciela (this), aby móc 'łańcuch' wielokrotne wywołania metod nazywa się płynny API. można rozwiązać problemu przy użyciu rodzajowych, choć otrzymany kod może być w jakiś sposób mniej czytelny choć:

public class Person<T extends Person<T>> { 
    public T setName(String name) { 
     // do anything 
     return (T)this; 
    } 
} 

public class Student extends Person<Student> { 
    public Student setStudentId(String id) { 
     // do anything 
     return this; 
    } 
} 

public class Teacher extends Person<Teacher> { 
    public Teacher setParkingLotId(int id) { 
     // do anything 
     return this; 
    } 
} 

Teraz nie trzeba żadnych odlewów:

Student s = new Student().setName("Jessy").setStudentId("1234"); 
Teacher t = new Teacher().setName("Walter").setParkingLotId(17); 

Zobacz także: Using Generics To Build Fluent API's In Java

+0

Prosto do rzeczy – pisaruk

0

Możliwe jest, aby te metody zwróciły SubTest, ponieważ typy powrotne Java są kowariancyjne.

Musisz zastąpić te metody, dzięki czemu można powrócić this, a SubTest w SubTest, np:

@Override 
public SubTest setTest(String message) { 
    super.setTest(message); // same functionality 
    return this; 
} 
+0

Czy muszę zastąpić wszystkie metody dla wszystkich klas? – MinusKube

+0

Tak, inaczej zwrócą 'ten' wpisany jako' Test'. Przynajmniej te przesłanki są trywialne. – rgettman