我创建了一个IMessage接口。它用于确保所有消息都有一个Header和Body。我遇到了一个问题,一条消息没有Header,但它需要接口。
我有3个选项:
我使用选项1是否正确?
我简化了我的程序,通常getHeader,getBody和getFull返回某种类型的数组。问题是如何处理getHeader,因为一条消息没有标题。
struct IMessage
{
virtual int getHeader() = 0;
virtual int getBody() = 0;
virtual int getFull() = 0;
};
class Message1 : public IMessage
{
int header;
int body;
int full;
public:
int getHeader() { return header;}
int getBody() { return body;}
int getFull() { return full;}
};
class Message2 : public IMessage
{
int body;
int full;
public:
int getHeader() { //Optional or exception } //I don't have a header
int getBody() { return body; }
int getFull() { return full; }
};
答案 0 :(得分:3)
如果界面的目的是表示带有标题和正文的消息,那么为什么没有标题的消息需要"界面?
相反,也许你应该有两个接口。一个代表所有消息,唯一的要求是一个正文。另一个扩展了该接口以及具有标题的要求。然后使用适当的。
或者,考虑一个缺少的标题实际上是一个存在但空的标题。这是你的选择3。
答案 1 :(得分:2)
我创建了一个IMessage接口。它用于确保所有消息都有一个Header和Body。
如果这实际上是IMessage
的工作,那么你的新事物不是IMessage
。
当然,像IMessage
这样的类型通常都是错误的想法,正因为如此;绝对规则很少见。
- 对于getHeader()
的这一个实现,使用可选的,我们总是返回一个空的可选项- 抛出异常,需要抓住才能继续
- 为标题
返回一个空数组 醇>
(2)似乎是一个可怕的想法。例外情况应保留为"如果程序因此结束,则优于继续"或类似情况。出于多种原因,将它们用于控制流是一个坏主意。
(3)vs(1)取决于空数据块是否与丢失的数据不同。有时他们是相同的,有时不是。如果它们是相同的,(1)是坏的,因为你得到了代表相同事物的2个状态;如果它们不同,则(3)是不好的,因为你得到一个代表两件事的状态。