我正在尝试创建一个能够处理程序中文件管理的对象。
Path接口几乎有我需要的所有方法,但我想添加一些自定义的方法。如果我在我的对象中实现Path,我将必须覆盖所有路径的方法。
有没有办法创建一个具有Path接口的所有方法和一些其他方法的对象,而不实际覆盖接口的方法?
在某种程度上,我想扩展Path接口,但也可以定义任何其他方法体。
答案 0 :(得分:1)
我可能会警告你关于Path Interface的一些小问题。另外,我有两个实现此接口的建议。
据我所知,Path Interface可以为文件操作符对象中的路径创建一个类型引用点。可以使用Paths Helper Class创建路径(注意-s)。但是,它从未被任何类实现。因此,它是一个用于在公共类型中传递数据的接口。这意味着,编码器应该使用Path Interface作为类型发送信息,然后在声明为接收Path Type Object的其他类操作上使用Path Typed Object。因此,在我看来,实现路径类并不是必需的。
正如我所提到的,我可以向你推荐两件事:虽然,这些类型的做法并不是好的设计决策。 JavaSE7 Doc:here
中也提到了此问题1)首先,您不必向界面中的所有方法添加行为。您可以使用“未实现”的msg日志声明它们并返回空值。
2)但更好的方法是使用Ali Alamiri提到的抽象类。我个人不会大惊小怪为摘要创建一个子类,只是实现我想要的方法。如果我想为它制作更多容错应用程序,那么使用子类来携带所有未实现的方法,并为所有这些方法使用警告消息日志。
答案 1 :(得分:1)
您可以使用Decorator pattern。
请记住例如BufferedReader?这与你的情况非常相似 - 它是一个围绕任何Reader的薄包装器(装饰器),它使得它被缓冲并具有一些额外的方法(可以读取行)。
public class DecoratedPath implements Path {
private final Path path;
public DecoratedPath(Path path) {
this.path = path;
}
public DecoratedPath(String stringPath) {
this(Paths.get(stringPath));
}
// add any additional constructors / factory methods you like
@Override
public int compareTo(Path other) {
return path.compareTo(other);
}
@Override
public int endsWith(Path other) {
return path.endsWith(other);
}
// Etc. for all the methods of the Path interface.
// They'll all delegate to the methods of the path field.
// You can also enhance some of them, if you want to,
// to return DecoratedPath instead of Path.
// your additional methods
}
用法:
DecoratedPath path = new DecoratedPath("/some/path");
答案 2 :(得分:0)
您可以做的是创建一个实现abstract
接口的Path
类。在这个类中,您可以实现方法或使它们未实现,以便另一个类可以处理它们。然后,您可以扩展此抽象类并覆盖您想要的任何方法,并且您不必覆盖每个方法。
例如:
public abstract class AbstractPath implements Path
{
//All methods declarations from Path interface
}
public class Base extends AbstractPath
{
//Override any method declared in AbstractPath
}