C ++是否为某些通用读取和/或写入访问分隔了抽象类(接口)?

时间:2014-01-31 10:15:51

标签: c++ interface abstract-class pure-virtual

如果它需要一些通用的读取和/或写入访问,最好这样做吗?:

class IRead {
public:
    virtual int read() const = 0;
};

class IWrite {
public:
    virtual void write(int) = 0;    
};

class concrete_readonly : public IRead {
public: 
    virtual int read() const {  ... }
};

class concrete_writeonly : public Iwrite {
public: 
    virtual void write(int i) { ... }
};

class concrete_readwrite : public IRead, public IWrite {
public: 
    virtual int read() const { ... }
    virtual void write(int i) { ... }
};

或者更好的是具有单一界面并且在派生的具体类中不允许不受欢迎的访问,这样的检验? :

class IAccess {
public:
    virtual int read() const = 0;
    virtual void write(int) = 0;    
};

class concrete_readonly : public IAccess {
public: 
    virtual int read() const {  ... }
    virtual void write(int i) { assert(0); }
};

class concrete_writeonly : public IAccess {
public: 
    virtual int read() const { assert(0); return 0; }
    virtual void write(int i) {  ... }
};

class concrete_readwrite : public IAccess {
public: 
    virtual int read() const { ... }
    virtual void write(int i) { ... }
};

或者可以做别的事情吗?

3 个答案:

答案 0 :(得分:2)

第一种方式更好,因为Liskov Substitution Principle。提供读写的基类但实际上不能保证任何一个都可以工作基本没用。提供有保证功能的两个基类更有用。

另一方面,请谨慎行事,因为虽然人们很容易认为阅读和写作可以干净利落地抽象,但通常情况并非如此。例如,使用网络套接字进行读写需要额外的状态来处理异步操作;从UDP读取数据报的语义与来自TCP等的数据包不同。

答案 1 :(得分:0)

我可能会说,可能是前者,其原因是;如果它是一个具体的只读类,为什么编译器会对它强制执行Write(...)方法?

答案 2 :(得分:0)

这个问题可能比读/写访问更为笼统,但由于目前尚不清楚,我将总结一些原因,以便我完全反对它:

  • C ++已经有了const
  • 只写使用很少(硬件访问?)
  • 你至少需要这个模板(只有读/写整数?),它可能会变得复杂
  • 没有功能增益
  • 强制您的类具有虚函数(和虚拟析构函数),而不会使用多态。
  • 只有在需要时才能使用Getters / setter,类应该最好只做一些事情

对于否定性感到抱歉,这只是建议。