是否应该避免使用 instanceof 和向下转型?

2020-01-07 01:08:00 +08:00
 1oNflow

比如设计一个文件系统,linux 上把文件和文件夹都看成文件,那就有一个抽象的文件

abstract class AbstractFile {
   protected String name;

   AbstractFile(String name) {
      this.name = name;
   }
}

文件夹里面有一个 HashMap,这里因为可能包含文件或者文件夹,所以使用了抽象类

class Directory extends AbstractFile {
    Map<String, AbstractFile> children;
    
    public Directory(String name) {
        super(name);
        this.children = new HashMap<>();
    }
}

文件里有 content

class File extends AbstractFile {
    String content;
    public File(String name) {
        super(name);
        this.content = "";
    }
}

那比如 ls 操作,因为对于文件和文件夹有不同的处理方式,判断是文件夹后还需要向下转型

for (int i = 1; i < path.length; i++) {
    child = curFolder.children.get(path[i]);
    if (child instanceof Directory) {
        curFolder = (Directory) child;
    }
}

感觉使用 instanceof 和向下转型不是特别好,但是面对 OOD 总是抑制不住地想多弄几个继承...

如果不用继承,只有一个 File 类,里面加一个 isFile 变量,判断的部分还是会存在,会是一个更好的方案吗?

1056 次点击
所在节点    问与答
2 条回复
ccpp132
2020-01-07 01:42:44 +08:00
isfile 可以是一个接口,不影响你继承
或者这种场景用 visitor pattern 也行。
1oNflow
2020-01-07 09:20:03 +08:00
@ccpp132 感谢回复,如果两个子类都实现 isfile 接口的话,instanceof 可以避免,但似乎还是需要向下转型? visitor pattern 之前也查到了,的确可行,但感觉写起来比较复杂…

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/635639

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX