C 分开的抽象类(接口),用于某些通用读取和/或写入访问

C++ separated abstract classes (interface) for some generic read and/or write access or not?

本文关键字:读取 访问 抽象类 接口 用于      更新时间:2023-10-16

如果需要一些通用读取和/或写入访问,最好以这种方式进行操作?:

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

或最好在派生的混凝土类中使用单个接口和diss允许不良的经过这种方式?:

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

或可以做其他事情?

第一种方法是更好的,因为Liskov替代原则。提供读写但实际上不能保证这两个基本上工作的基础课程基本上都是没有用的。提供保证功能的两个基础类更有用。

另一方面,请谨慎行事,因为虽然很容易认为阅读和写作可以简洁地抽象,但通常不是这样。例如,使用网络插座的阅读和写作需要额外的状态来处理异步操作。从UDP读取数据报的语义与TCP的数据包不同,等等。

可能是我要说的前身,原因是;如果这是一个具体的Readonly类,为什么编译器应该在其上执行Write(...)方法?

这个问题可能比阅读/写入访问更一般,但是由于不清楚,我会总结一些我完全建议它的原因:

  • C 已经有const
  • 仅写的几乎没有用(硬件访问?)
  • 您至少需要模板(仅读/写入ints?),并且可能变得复杂
  • 没有功能增益
  • 您强迫类具有虚拟函数(和虚拟破坏者),而无需用于多态性。
  • 只能在需要时使用Getters/Setters,最好只能做某事

对不起,这只是建议。