![](/img/trans.png)
[英]Passing Derived Class to a method which needs to override expecting a base class
[英]Write a method implementation in base class which requires override in subclasses?
在Java ...
我正在创建一个包含方法doAction()的类Foo。 我的要求:
abstract会工作,除了它不允许我为doAction()指定一个函数体。
同时满足所有要求,故事结束是不可能的。 你必须放弃至少一个条件,并且可能会考虑采用一种完全不同的方法来解决你想要解决的问题。
使用两种不同的方法。 或者:
abstract class Foo {
// Override this method
abstract void doActionInSubclass();
// You can't override a final method
// And you don't want subclases to override this one
final void doAction () {
// do whatever default-y things you want here
doActionInSubclass();
}
}
或者只是将“required”方法与要强制子类覆盖的方法完全分开:
abstract class Foo {
abstract void mustOverrideThisInConcreteSubclasses();
final void doAction() {
// default-y things here
}
}
如果为Java中的方法提供默认实现,则不能强制子类再次覆盖它。 如果可以,请使用不同方法名称的模板方法模式:
public class Foo{
public abstract void templateMethod();
public final void doAction(){
//default implementation
templateMethod(); // call template method
}
}
在Foo
实现您的方法并使其始终抛出异常,如UnsupportedOperationException
。 这将要求子类覆盖该方法。
如果所有子类都应该覆盖它,为什么要提供默认实现?! 因为没有人会使用它,所以毫无意义。 但是,您可能有一些doAction的代码,您希望由任何子类和一些您想要覆盖的代码执行。 在这种情况下,您可以设计如下:
doAction(){
//put your default code here...
specificAction();
}
abstract specificAction();
这样,doAction就有了自己的实现,它由一个特定的动作调用结束,而这个调用应该由子类实现
在类Foo
的构造函数中,您可以使用反射 :
class Foo {
public Foo() {
Class c = getClass();
if (!c.equals(Foo.class))
{
// try/catch omitted for brevity
Method m = c.getMethod("methodName", new Class[0]);
if (m.getDeclaringClass().equals(Foo.class))
{
throw new Exception("blah blah blah");
}
}
}
}
这不会产生编译时错误,但由于在构造函数中调用super()
不能用try
包装,所以任何人都无法创建子类来绕过它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.