这是第一本设计模式书中的代码片段:
public class LowerCaseInputStream extends FilterInputStream {
public LowerCaseInputStream(InputStream in) {
super(in);
}
public int read() throws IOException {
int c = super.read();
return (c == -1 ? c : Character.toLowerCase((char)c));
}
public int read(byte[] b, int offset, int len) throws IOException {
int result = super.read(b, offset, len);
for (int i = offset; i < offset+result; i++) {
b[i] = (byte)Character.toLowerCase((char)b[i]);
}
return result;
}
}
同一章中还有另一个玩具示例:
public class Mocha extends CondimentDecorator {
Beverage beverage;
public Mocha(Beverage beverage) {
this.beverage = beverage;
}
public String getDescription() {
return beverage.getDescription() + ", Mocha";
}
public double cost() {
return .20 + beverage.cost();
}
}
两者非常相似,不同之处在于Macha类内部有一个具体的对象可以初始化和使用,而LowerCaseInputStream类通过初始化InputStream对象super(in)
,后来似乎通过使用该super.read()
函数来使用此对象。
我对超级功能在这里的工作方式感到困惑。在Mocha示例中,非常清楚的是,它在内部包装了一个饮料对象,并调用其方法并修改了结果,而在LowerCaseInputStream类中,行为修改是如何进行的却不是直截了当的。
第一种情况super
是在基类中引用构造函数FilterInputStream
。如果父类的构造函数有参数,则扩展它的任何类都必须使用显式调用适当的构造函数super
。如果基类仅具有无参数构造函数,super
则Java隐式提供该构造函数。
在第二种情况下,FilterInputStream
read
方法已被重载LowerCaseInputStream
。这意味着对的任何调用都LowerCaseInputStream.read()
将转到其实现中。因此,LowerCaseInputStream
为了调用read
实现FilterInputStream
(以获得标准行为),必须引用该实现,super
否则它将是一个无限循环。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句