我已经使用界面实现了流畅的方法。但我需要附加其他具体方法来保持原有的功能。
我扩展了原始界面并创建了其他界面。
但我无法将方法调用链接起来。 返回类型是Object,但方法很好实现。
我不知道将实例化哪种类型的对象。它在运行时确定。所以我不能转向具体的实现,例如
PlainTextProcessor<TabbedFile>
我如何解决这个问题?
所需功能:
// TabbedFile is determined at runtime. I only
// know that the instantiated type should implement
// the PlainTextProcessor interface.
PlainTextProcessor processor = new TabbedFile();
processor.method1(arg1).method(arg2).method3(arg3);
代码:
// Base interface
public interface DataProcessor<T>
{
T method1(String classname);
T method2(String classname);
}
// Concrete interface
public interface PlainTextProcessor<T> extends DataProcessor<T>
{
T method3(String[] data);
}
// Concrete implementation
public class TabbedFile implements PlainTextProcessor<TabbedFile>
{
@Override
public TabbedFile method1(String classname)
{
...
return this;
}
@Override
public TabbedFile method2(String classname)
{
...
return this;
}
@Override
public TabbedFile method3(String[] data)
{
...
return this;
}
}
// TargetClass
public class Processor
{
private PlainTextProcessor processor;
...
public void Dowork()
{
// Created via factory
processor = ProcessorFactory.GetProcessor(param);
processor
.method(arg1)
.method2(arg2)
.method3(arg3);
}
答案 0 :(得分:3)
在Java中,从Java 1.5开始,您可以开箱即用covariant return types。 所以你的例子根本不需要通用。
// Base interface
public interface DataProcessor
{
DataProcessor method1(String classname);
DataProcessor method2(String classname);
}
// Concrete interface
public interface PlainTextProcessor extends DataProcessor
{
PlainTextProcessor method1(String classname);
PlainTextProcessor method2(String classname);
PlainTextProcessor method3(String[] data);
}
// Concrete implementation
public class TabbedFile implements PlainTextProcessor
{
@Override
public TabbedFile method1(String classname)
{
...
return this;
}
@Override
public TabbedFile method2(String classname)
{
...
return this;
}
@Override
public TabbedFile method3(String[] data)
{
...
return this;
}
}
答案 1 :(得分:0)
只需将方法调用链接到构造函数即可。
PlainTextProcessor processor = new TabbedFile()
.method1(arg1)
.method(arg2)
.method3(arg3);
一旦你告诉编译器“这是一个PlainTextProcessor”,你只能使用该接口定义的方法。这包括这些方法的返回类型,对于接口而言,这些方法是泛型。