gpt4 book ai didi

c++ - 如何在 C++ 中使用非虚拟接口(interface)成语实现接口(interface)类?

转载 作者:太空狗 更新时间:2023-10-29 19:47:15 27 4
gpt4 key购买 nike

在 C++ 中,接口(interface)可以由方法是纯虚拟的类实现。

这样的类可以是库的一部分,用于描述一个对象应该实现哪些方法才能与库中的其他类一起工作:

class Lib::IFoo
{
public:
virtual void method() = 0;
};

:

class Lib::Bar
{
public:
void stuff( Lib::IFoo & );
};

现在我想使用 Lib::Bar 类,所以我必须实现 IFoo 接口(interface)。

为了我的目的,我需要一整套相关的类,所以我想使用一个基类来保证使用 NVI 习惯用法的常见行为:

class FooBase : public IFoo // implement interface IFoo
{
public:
void method(); // calls methodImpl;

private:
virtual void methodImpl();
};

非虚拟接口(interface) (NVI) 习惯用法应该拒绝派生类覆盖 FooBase::method() 中实现的常见行为的可能性,但是由于 IFoo使它成为虚拟的,似乎所有派生类都有机会覆盖 FooBase::method()

如果我想使用 NVI 习惯用法,除了已经建议的 pImpl 习惯用法之外,我还有哪些选择(感谢 space-c0wb0y)。

最佳答案

我认为你的 NVI 模式是错误的: http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Non-Virtual_Interface

但不确定这是否能解决您的问题。

class IFoo
{
public:
void method() { methodImpl(); }
private:
virtual void methodImpl()=0;
};

class FooBase : public IFoo // implement interface IFoo
{
private:
virtual void methodImpl();
};

下面是一个示例,说明为什么您可以使用从 XML 读取的读取器和另一个从 DB 读取的读取器来执行此操作。请注意,公共(public)结构被移入 NVI readFromSource,而非公共(public)行为被移入私有(private)虚拟 getRawDatum。这样,日志记录和错误检查仅在一个函数中需要。

class IReader
{
public:
// NVI
Datum readFromSource()
{
Datum datum = getRawDatum();
if( ! datum.isValid() ) throw ReaderError("Unable to get valid datum");
logger::log("Datum Read");
return datum;
}
private:
// Virtual Bits
Datum getRawDatum()=0;
};

class DBReader : public IReader
{
private:
Datum getRawDatum() { ... }
};

class XmlReader : public IReader
{
private:
Datum getRawDatum() { ... }
};

关于c++ - 如何在 C++ 中使用非虚拟接口(interface)成语实现接口(interface)类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2735563/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com