Zdravim vsetkych.
Nacrtnute riesenie je zrele na refaktoring. Je tu jedno riesenie povodneho
problemu, s vyuzitim ‘generics‘ aj ked nie s cistym pouzitim:
public interface Algorithm<T> {
public void move(T object);
}
public class AlgorithmBookImpl implements Algorithm<Book> {
public void move(Book book) {
System.out.println("AlgorithmBookImpl.move(Book)");
}
}
public class AlgorithmPencilImpl implements Algorithm<Pencil> {
public void move(Pencil pencil) {
System.out.println("AlgorithmPencilImpl.move(Pencil)");
}
}
public class AlgorithmFactory {
public static <T> Algorithm<T> getAlgorithm(Class<T> clazz) {
Algorithm<T> algorithm = null;
if (Book.class.equals(clazz)) {
algorithm = (Algorithm<T>) new AlgorithmBookImpl();
} else if (Pencil.class.equals(clazz)) {
algorithm = (Algorithm<T>) new AlgorithmPencilImpl();
}
return algorithm;
}
}
a potom pouzitie:
public class AlgorithmFactoryTest extends TestCase {
public void testGetAlgorithmForUnknownType() {
Object o = new Pencil(); // new Book();
Algorithm algorithm = AlgorithmFactory.getAlgorithm(o.getClass()); //
no correct usage of generic
algorithm.move(o);
}
public void testGetAlgorithmForBook() {
Algorithm<Book> algorithm = AlgorithmFactory.getAlgorithm(Book.class);
algorithm.move(new Book());
}
public void testGetAlgorithmForPencil() {
Algorithm<Pencil> algorithm =
AlgorithmFactory.getAlgorithm(Pencil.class);
algorithm.move(new Pencil());
}
}
Stano
> Date: Mon, 14 Jul 2008 19:20:23 +0200
> From: " Filip Jirsák " <[EMAIL PROTECTED]>
> Subject: Re: Rozhranní a přetížené metody
> To: Java <[email protected]>
> Message-ID:
> <[EMAIL PROTECTED]>
> Content-Type: text/plain; charset=UTF-8
>
> Dobrý podvečer,
> musel byste mít onu obecnou metodu i v té třídě, a v ní podle typu
> volaného parametru převolat příslušnou specializovanou metodu. Tedy
> něco jako:
>
> public void move(Object o) {
> if (o instanceof Book) {
> move(book);
> } else if ?
> }
>
> Záleží na tom, co přesně chcete dělat, někdy se hodí to spojit s
> enumem, někdy se vyplatí udržovat si typ třídy v abstraktním předkovi
> (místo Object byste měl nějaký abstraktní typ ? předchůdce Book i
> Pencil) ? nemusíte pak typ zjišťovat přes reflexi, někdy se to dá
> spojit s generikami (interface pak má jako typový paramter, s jakou
> třídou jej budete volat) ? v posledním případě by ale návrh tříd musel
> vypadat stejně trochu jinak, jednotlivé specializované metody move()
> byste musel mít ve zvláštních třídách.
>
> Filip Jirsák
>
>
> 2008/7/14 <[EMAIL PROTECTED]>:
>
>> Dobrý den
>>
>> mám třídu s několika přetíženými metodami:
>>
>> public class AlgorithmImpl implements Algorithm{
>>
>> public void move(Book book){
>> ...
>> }
>>
>> public void move(Pencil pencil){
>> ...
>> }
>>
>> }
>> ------------------------------------------
>> Mohu nějak k této třídě napsat rozhranní, tak aby používalo přetížené metody?
>>
>> Něco takového?
>> public interface Algorithm {
>>
>> public void move(Object o);
>>
>> }
>>
>>
>> Děkuji
>> Tomáš Jurman
>>