V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
1oNflow
V2EX  ›  问与答

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

  •  
  •   1oNflow · 2020-01-07 01:08:00 +08:00 · 1051 次点击
    这是一个创建于 1570 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如设计一个文件系统,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 变量,判断的部分还是会存在,会是一个更好的方案吗?

    2 条回复    2020-01-07 09:20:03 +08:00
    ccpp132
        1
    ccpp132  
       2020-01-07 01:42:44 +08:00 via Android
    isfile 可以是一个接口,不影响你继承
    或者这种场景用 visitor pattern 也行。
    1oNflow
        2
    1oNflow  
    OP
       2020-01-07 09:20:03 +08:00 via iPhone
    @ccpp132 感谢回复,如果两个子类都实现 isfile 接口的话,instanceof 可以避免,但似乎还是需要向下转型? visitor pattern 之前也查到了,的确可行,但感觉写起来比较复杂…
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5398 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 07:30 · PVG 15:30 · LAX 00:30 · JFK 03:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.