如果它需要一些通用的读取和/或写入访问,最好这样做吗?:
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) { ... }
};
或者可以做别的事情吗?
答案 0 :(得分:2)
第一种方式更好,因为Liskov Substitution Principle。提供读写的基类但实际上不能保证任何一个都可以工作基本没用。提供有保证功能的两个基类更有用。
另一方面,请谨慎行事,因为虽然人们很容易认为阅读和写作可以干净利落地抽象,但通常情况并非如此。例如,使用网络套接字进行读写需要额外的状态来处理异步操作;从UDP读取数据报的语义与来自TCP等的数据包不同。
答案 1 :(得分:0)
我可能会说,可能是前者,其原因是;如果它是一个具体的只读类,为什么编译器会对它强制执行Write(...)方法?
答案 2 :(得分:0)
这个问题可能比读/写访问更为笼统,但由于目前尚不清楚,我将总结一些原因,以便我完全反对它:
对于否定性感到抱歉,这只是建议。