Java使用一个接口在两个类中实现不同的方法

时间:2016-08-08 20:56:43

标签: java

我有一个Java问题,我无法看到如何正确实现这些方法。我对建筑不太满意。

Data Manager界面类:

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
}

Data Writer类:

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

如果我想在只有一个接口的两个不同类中分别实现readData()和writeData(),是否可能?我不知道为什么我这样做。当我向读者或作家类添加更多方法时,它可能看起来更简洁。我应该只在一个班级中实现所有内容吗?

我希望这个库允许使用manager对象的用户访问数据读取和写入。但是为了实施,我不知道如何正确地做到这一点。

4 个答案:

答案 0 :(得分:3)

看起来你偶然发现了“Interface Segregation Principal”的原因。 https://en.wikipedia.org/wiki/Interface_segregation_principle

虽然DataReaderDataWriter最初看似相关,看起来将它们组合到您的公共接口DataManager中似乎是有意义的,但是阅读和写作的工作是相当的不同的,并保证分成两个接口,例如IReaderIWriter

假设您有一个同时需要读者和作者的类,因此您的DataManager界面是有意义的。但是,没有什么可以阻止您传递两个对象,一个类型为IReader,另一个类型为IWriter ,即使它们是下面的同一个类。但似乎您已将它们分为DataReaderDataWriter,这很好。正如其他答案所暗示的那样,这是单一责任委托人的应用。

答案 1 :(得分:2)

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

另外,请勿在名称中使用ReaderWriter分别列出java.io.Readerjava.io.Writer不属于的子类型。既然您正在考虑"数据管理员",也许您可​​以使用ReadManagerWriteManager,或类似的东西,让人们知道您没有使用标准的ReaderWriter层次结构。

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

Data Manager界面类:

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(){...};
}

Data Writer类:

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

示例:

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

因此,客户端将仅使用管理器公共接口中的方法来进行数据库读取和写入。爱德华彼得斯向我提到了作文,当时我并不理解。我不太确定我现在正在做的是组合应该做什么。我认为应归功于他。谢谢你的帮助。