Instanz von hier keine gute Praxis ist.
Die richtige Lösung hängt davon ab, was genau in dieser doSomething
-Methode vor sich geht. Wenn Sie es auf Ihre Weise tun, verletzen Sie neben anderen Dingen auch Liskov Substitution Principle. Ich nehme an, dass Sie entschieden haben, dass Sie diese Hierarchie an erster Stelle wegen etwas brauchen, und ich nehme auch an, dass Subtypen mehr Verhalten als nur DoSomething-Methode haben. In diesem Fall sehen Sie, was Sie tun können. Grundsätzlich nur Typen, die eigentlich doSomething
tun sollten und der Rest der Typen machen so etwas wie no operation
. Auf diese Weise können Sie diese Objekte verwenden, ohne zu wissen, um welchen Typ es sich handelt.
Sie sollten sich auch fragen, ob Sie die Basisklasse wirklich als abstrakte Klasse benötigen. Vielleicht brauchst du nur eine Schnittstelle. Es könnte einen besseren Ansatz geben, aber basierend auf den Informationen, die ich habe und was ich angenommen habe, scheint dies in Ordnung zu sein.
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();
}
Polymorphie verwenden; deshalb existiert es. –
genau - statt doSomething (Basis) - sollten Sie einige base.doSomething() implementieren, die in foo.doSomething() überschrieben wird. Google Polymorphismus Java - oder - überschreiben Methode Java. –
Ich mag diese besondere Antwort: http://www.javapractices.com/topic/TopicAction.do?Id=31. Ich weiß, dass C++ und Java anders sind, aber ** "Immer wenn Sie den Code des Formulars schreiben" wenn das Objekt vom Typ T1 ist, dann tun Sie etwas, aber wenn es vom Typ T2 ist, dann machen Sie etwas anderes, "schlagen Sie sich selbst. * * – thang