添加两个类扩展它的抽象类的最佳方法是什么?

时间:2016-10-31 18:08:45

标签: java abstract-class abstract

我有两种方法可以将文本写入文本文件。除了他们写的filepath之外,这两种方法几乎完全相同。这是我的两个代码。

public class WriteFileTeacher {
  private String filename="/mylocation/teachers.txt";
  public void writeToFileTeacher (String course) {
    try (FileWriter fw = new FileWriter(filename, true);
         BufferedWriter bw = new BufferedWriter(fw);
         PrintWriter out = new PrintWriter(bw)) {
      out.println(course);// this is what gets saved
    } catch (IOException e) {
    }
  }
}


public class WriteFileCourse {
  private String filename="/mylocation/courses.txt";
  public void writeToFileCourse (String course) {
    try (FileWriter fw = new FileWriter(filename, true);
         BufferedWriter bw = new BufferedWriter(fw);
         PrintWriter out = new PrintWriter(bw)) {
      out.println(course);// this is what gets saved
    } catch (IOException e) {
    }
  }
}

由于两种方法除了路径名之外几乎完全相同,我一直在寻找关于如何编写抽象类的建议,这两个类都可以扩展吗?

3 个答案:

答案 0 :(得分:1)

public class FileWriter {
    private final String fileName;

    public FileWriter(String fileName) {
        this.fileName = fileName;
    }

    public void writeToFile() {
        // your source is this.fileName
    }
}

由于writeToFileTeacher方法的相同性,在这种情况下您不需要类层次结构。只需创建一个以文件名作为参数的构造函数,这意味着您的编写者应该写入的位置。

这是写入文件的常用类,不用担心方法命名,只需将其命名为writeToFile

答案 1 :(得分:0)

文件名值可以是来自具体子类的私有信息。
因此,使用参数传输此信息可能是不可取的。

为什么不将这两种方法放在一起,因为它们做同样的事情? 您可以使用私有方法对公共处理进行分解。

{{1}}

答案 2 :(得分:0)

我认为最好的方法可能就是这样:

public class MyAbstractWriterClass {

    protected abstract String getFilePath();

    public void writeToFileTeacher(String course){
        try (FileWriter fw = new FileWriter(getFilePath(), true);
            BufferedWriter bw = new BufferedWriter(fw);
            PrintWriter out = new PrintWriter(bw)) {
            out.println(course);// this is what gets saved
        } catch (IOException e) {
        }
    }
}

或者您可以创建一个类来写入任何文件,只传递String内容并将此writer类作为参数传递给yout主类(如策略模式):

class GenericFileWriter {
    private final filePath;
    GenericFileWriter(String file) {
        this.filePath = file;
    }
    public void write(String content) {
        try (FileWriter fw = new FileWriter(this.filePath, true);
            BufferedWriter bw = new BufferedWriter(fw);
            PrintWriter out = new PrintWriter(bw)) {
            out.println(course);// this is what gets saved
        } catch (IOException e) {
        }
    }
}