wystąpienie nie jest dobrą praktyką tutaj.
Prawidłowe rozwiązanie zależy od tego, co dokładnie dzieje się w metodzie doSomething
. Jeśli zrobisz to na swój sposób, to poza tym naruszysz Liskov Substitution Principle. Zakładam, że zdecydowałeś, że potrzebujesz tej hierarchii przede wszystkim z powodu czegoś, a także założę, że podtypy mają nieco więcej zachowań niż tylko metodę Zrób coś. W tym przypadku, co możesz zrobić, pokazano poniżej. Zasadniczo tylko typy, które powinny to zrobić, a reszta typów powinna być podobna do no operation
. W ten sposób możesz używać tych obiektów, nie wiedząc, jakiego typu naprawdę są.
Powinieneś także zadać sobie pytanie, czy naprawdę potrzebujesz klasy bazowej, aby być klasą abstrakcyjną. Może potrzebujesz tylko interfejsu. Może być lepsze podejście, ale w oparciu o posiadane informacje i to, co założyłem, wydaje się, że wszystko jest w porządku.
public abstract class Base
{
public abstract void doSomething();
public void someOtherMethod()
{
// which does stuff
}
}
public class SubTypeWhichCanDoSomething extends Base
{
@Override
public void doSomething()
{
// actually implement method and DO something
}
}
public class DoesNothing extends Base
{
@Override
public void doSomething()
{
// does nothing
return;
}
}
// then your code looks like these
for(Base base : bases)
{
base.doSomething();
}
Użyj polimorfizmu; właśnie dlatego istnieje. –
exact - zamiast doSomething (base) - powinieneś zaimplementować metodę base.doSomething(), która jest nadpisana w foo.doSomething(). Google polimorfizm java - lub - przesłonić metodę java. –
Podoba mi się ta konkretna odpowiedź: http://www.javapractices.com/topic/TopicAction.do?Id=31. Zdaję sobie sprawę, że C++ i Java są różne, ale ** "Za każdym razem, gdy piszesz kod formularza", jeśli obiekt jest typu T1, to zrób coś, ale jeśli jest to typ T2, to zrób coś innego, "uderz się." * – thang