这是一个懒惰的问题,但你得到了代表:-)
我有一个Java类,它返回自身的实例以允许链接(例如ClassObject.doStuff().doStuff())
例如:
public class Chainer { public Chainer doStuff() { /* Do stuff ... */ return this; } }
我想扩展这个课程.有没有办法,也许使用泛型,扩展这个类而不必覆盖每个方法签名?
不是:
public class ChainerExtender extends Chainer { public ChainerExtender doStuff() { super.doStuff(); return this; } }
我试过了:
public class Chainer { public A doStuff() { /* Do stuff ... */ return (A)this; } } public class ChainerExtender extends Chainer { public A doStuff() { /* Do stuff ... */ return super.doStuff(); } }
但这不起作用给出错误:
type parameters of A cannot be determined; no unique maximal instance exists for type variable A with upper bounds A,Chainer
我是否被迫拥有类声明:
public class Chainer> {} public class ChainerExtender extends Chainer
按照这个问题?
你有没有尝试过直截了当
public class Chainer { public Chainer doStuff() { /* Do stuff ... */ return this; } } public class ChainerExtender extends Chainer { @Override public ChainerExtender doStuff() { /* Do stuff ... */ super.doStuff(); return this; } }
使用Java 5,您可以声明重写方法以具有共变量返回类型,这意味着这就是:子类可以具有更具体的返回类型的重写方法签名.
为什么不让它们全部返回界面?您必须在接口中定义所有可能的链接方法,并在基类中提供"null"实现,但您可以链接到您的内心.
public interface IChainer { IChainer doStuff(); IChainer doSomethingElse(); } public class Chainer implements IChainer { public IChainer doStuff() { // really do something return this; } public IChainer doSomethingElse() { return this; // do nothing } } public class ChainerExtender extends Chainer { // simply inherits implementation for doStuff() public override IChainer doSomethingElse() { // really do something return this; } }
注意:我上面可能有一些语法问题.在过去的几年里,我一直在使用C#进行编程.希望你明白了.