экземпляра не является хорошей практикой здесь.
Правильное решение будет зависеть от того, что именно происходит внутри этого метода doSomething
. Если вы делаете это по-своему, то, помимо других вещей, вы нарушаете Liskov Substitution Principle. Я предполагаю, что вы решили, что вам нужна эта иерархия в первую очередь из-за чего-то, и я также предполагаю, что подтипы имеют некоторое поведение, а не только метод doSomething. В этом случае то, что вы можете сделать, показано ниже. В основном только те типы, которые должны на самом деле сделать это, и остальные типы делают что-то вроде no operation
. Таким образом, вы можете использовать эти объекты, не зная, какой тип они на самом деле.
Вы также должны спросить себя, действительно ли вам нужен класс Base для абстрактного класса. Возможно, все, что вам нужно, это интерфейс. Возможно, будет лучший подход, но, основываясь на информации, которую я имею и что я предположил, тогда это, похоже, все в порядке.
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();
}
Использовать полиморфизм; поэтому он существует. –
точно - вместо doSomething (base) - вы должны реализовать некоторый base.doSomething(), который переопределяется в foo.doSomething(). Google полиморфизм java - или - переопределить метод java. –
Мне нравится этот конкретный ответ: http://www.javapractices.com/topic/TopicAction.do?Id=31. Я понимаю, что C++ и Java разные, но ** «Каждый раз, когда вы находите себе код формы», если объект имеет тип T1, а затем что-то делать, но если он имеет тип T2, тогда сделайте что-нибудь еще », * – thang