【问题标题】:Java implements different methods in two classes using one interfaceJava使用一个接口在两个类中实现不同的方法
【发布时间】:2016-08-08 20:56:42
【问题描述】:

我有一个 Java 问题,但我不知道如何正确实现这些方法。我不太擅长建筑。

数据管理器接口类:

public interface DataManager {
   public void readData();
   public void writeData();
}

数据抽象类:

public abstract class Data implements DataManager {
    @Override
    public void readData() {};
    @Override
    public void writeData() {};
}

数据阅读器类:

public class DataReader extends Data {
   // I want to implement the readData() here
}

数据写入器类:

public class DataWriter extends Data {
   // I want to implement the writeData() here
}

如果我想在两个不同的类中分别实现 readData() 和 writeData() ,只有一个接口,可以吗?我不知道我为什么要这样做。当我向 reader 或 writer 类添加更多方法时,它可能看起来更干净、更容易。我应该在一个类中实现所有内容吗?

我希望这个库允许使用管理器对象的用户访问数据读写。但是对于实现,我不知道如何正确地做到这一点。

【问题讨论】:

  • 任何实现DataManager的类必须实现这两种方法。你可以有一个空的实现(比如在你的抽象类中),但如果你打算单独实现它们,最好将它分成两个接口。
  • 替代@resueman 的评论,您可以使用组合而不是继承来执行此操作。在这种情况下,您将拥有一个 DataManager 类,它将 DataReaderDataWriter 类作为构造函数参数,并将实现传递给它们。我认为这可能接近您的目标?
  • @resueman 谢谢,所以听起来我可以选择创建两个接口或在一个类中实现 DataManager。
  • @EdwardPeters 谢谢,我不确定我是否理解。你的意思是像 DataManager(DataReader 阅读器,DataWriter 作家)?所以在 DataReader 中有 readData(),在 DataWriter 中有 writeData()。然后 manager 将拥有这两个对象,以便使用它调用 read 和 write 方法。
  • @CaoFelix 这个想法是DataManager 类中的readwrite 方法将是调用DataReaderDataWriter 对象的非常小的“包装”方法通过了。这意味着,如果您有一组不同的 Writer 和一组不同的 Reader,您可以轻松地从它们的任意组合中创建一个 Manager。

标签: java


【解决方案1】:

您似乎偶然发现了“接口隔离原则”的原因。 https://en.wikipedia.org/wiki/Interface_segregation_principle

虽然DataReaderDataWriter 一开始可能看起来相关,并且将它们分组到您的通用界面DataManager 中似乎是有意义的,但读取和写入的工作是完全不同的,并且需要分开分成两个接口,例如IReaderIWriter

假设你有一个类同时需要读者和作者,那么你的DataManager 接口就有意义了。然而,没有什么能阻止你传递两个对象,一个是IReader 类型,一个是IWriter 类型即使它们是同一个类。但是您似乎已经将它们分成DataReaderDataWriter,这很好。正如其他答案之一所暗示的那样,这是单一责任主体的应用。

【讨论】:

    【解决方案2】:

    编程的最佳实践是“单一职责原则”。读者不是作者,所以它不应该是 DataManager 的子类型,它要求它的实现者两者都是。通过定义一个为整个接口创建空方法的抽象类,您也失去了拥有接口的价值。接口是每个实现者都必须 / 成为其超类型 / 情况的契约。读者不是 /be-a/ 读者作家的候选人。您需要一个单独的读取器和写入器接口,让您的读取器实现一个,写入器实现另一个,数据管理器可以实现两者。

    另外,不要在分别不是java.io.Readerjava.io.Writer 子类型的类型名称中使用ReaderWriter。由于您正在考虑“数据管理器”,也许您可​​以使用 ReadManagerWriteManager 或类似的东西,让人们知道您没有使用标准的 ReaderWriter 层次结构。

    【讨论】:

    【解决方案3】:

    如果您只有某个子类实现每个方法,则不需要DataManagerData。让DataReaderDataWriter 只包含他们需要的方法,如下所示:

    public class DataReader {
       public void readData() {...}
    }
    ...
    public class DataWriter {
       public void writeData() {...}
    }
    

    扩展和实现的全部原因是要么清理代码,要么允许覆盖另一个方法。你这样做的方式两者都没有,所以为什么不保持简单呢?

    【讨论】:

    • 我同意你的看法。也许这不是一个很好的代码示例。我在实际应用程序中要做的是读取一些文件(即 CSV)并将数据保存到数据库中。它将创建表并将数据填充到列中。然后我需要从数据库中读取数据并生成不同的文件。所以会有阅读器来阅读文件和数据库。并且还将有用于将数据写入数据库并生成文件的编写器。问题是,不知何故,我的老板想让单个对象可以调用所有功能......
    • 你能不能只创建一个类,然后让它包含两种方法,而不包含任何接口/抽象类的东西?
    • 即使在如此简单的情况下,对界面进行编码也是一种很好的做法。
    【解决方案4】:

    经过大量修改,所以我这样做,我认为它适合我的解决方案。

    数据管理器接口类:

    public interface DataManager {
       public Data readData(); // from database
       public void writeData(); // to database
    }
    

    DataConnector 类:

    public class DataConnector implements DataManager {
       DataCreate creator = new DataCreate();
       @Override
       public Data readData() {
           return creator.readData();
       };
       @Override
       public void writeData() {
           creator.writeData();
       };
       public Connection getConnection() {...};
       public void close() {...};
    }
    

    数据创建类:

    public class DataCreate {
       public void readData() {
          new DataReader().readData();
       }
    
       public void writeData() {
          new DataWriter().writeData();
       }
    }
    

    数据阅读器类:

    public class DataReader {
       // I want to implement the readData() here
       public Data readData(){...};
    }
    

    数据写入器类:

    public class DataWriter {
       // I want to implement the writeData() here
       public void writeData(){...};
    }
    

    例子:

    DataManager manager = new DataConnector();
    manager.readData();
    manager.writeData();
    

    所以客户端只会使用管理器公共接口中的方法来进行数据库读写。爱德华·彼得斯(Edward Peters)向我提到作曲,当时我并不理解。我不太确定我现在所做的是否是作曲应该做的。我认为功劳应该归于他。感谢您的帮助。

    【讨论】:

      猜你喜欢
      • 2016-07-23
      • 1970-01-01
      • 2022-12-03
      • 2014-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多