gpt4 book ai didi

c++ - 设计模式 : uniform interface for partially supported derived classes

转载 作者:行者123 更新时间:2023-11-28 08:25:26 27 4
gpt4 key购买 nike

我正在为我的项目设计一个界面,我很好奇这个想法能否实现。这是情况,在运行时,我想使用一组基类指针来向不同的派生对象发出命令。不同的派生对象有不同的实现(虚函数)。我的问题是:如果这些对象得到了不同的接口(interface)支持级别,我怎样才能避免写一个空函数?

例如,(我当前的代码)

Class Base { //this is the main interface
public:
virtual void basicFun() = 0;
virtual void funA(int input1) {return;}
virtual void funB(int input2) {return;}
virtual void funC(int input3) {return;}
}

Class Derived1 : public Base { //this class support only funA()
public:
void basicFun() {//....}
void funA(int input1) {//do something}
}

Class Derived2 : public Base { //this class support both funA() funB()
public:
void basicFun() {//....}
void funA(int input1) {//do something}
void funB(int input2) {//do something}
}

Class Derived3 : public Base { //this class support all
public:
void basicFun() {//....}
void funA(int input1) {//do something}
void funB(int input2) {//do something}
void funC(int input3) {//do something}
}

假设:对于某个对象,永远不会调用不受支持的函数。即,如果 basePtr 指向的对象是 Derived1 或 Derived2,则永远不会调用 BasePtr->funC()。问题是:

  1. 如果需要统一接口(interface),我必须在 Base 或 Derived 中定义一个空函数
  2. 如果像上面那样定义了空函数,编译器会不断警告我未引用的参数 (input1~input3)。我当然可以关掉它,但就是不喜欢这种方式。

那么,有没有什么模式可以让我在不定义空函数的情况下实现统一的接口(interface)呢?这几天我一直在想这个问题。这似乎是不可能的。因为 funA() funB() 和 funC() 必须在接口(interface)中,这样我才能使用 Base 指针数组来控制所有对象,这意味着在 Derived1 中,必须以某种方式定义 funB() 和 funC()。

谢谢,感恩节快乐,感谢分享您的想法。

Solr 提

最佳答案

统一接口(interface)是件好事。这意味着您必须在接口(interface)中实现所有方法,即使这意味着您将拥有空方法。这个问题没有设计模式,因为它首先不是一个真正的问题。

想一想:假设您有一个 Car 接口(interface),带有方法 Accelerate()Brake()。派生自 Car 的类必须实现所有方法。您是否希望从 Car 派生的对象实现 Accelerate() 方法而不是 Brake() 方法?这将是一辆非常不安全的 Car!

OOP 上下文中的接口(interface)必须具有双方都遵守的定义明确的契约。在 C++ 中,这在一定程度上是通过要求在派生类中实现所有纯虚拟来强制执行的。尝试使用未实现的虚拟方法实例化一个类会导致编译错误,前提是不使用愚蠢的技巧来绕过它。

您反对创建空方法,因为它们会导致编译器警告。在您的情况下,只需省略参数名称:

void funC(int) // Note lack of parameter name
{
}

或者把名字注释掉:

void funC(int /*input3*/)
{
}

甚至by using templates!

template<class T> void ignore( const T& ) { }

//...

void funC(int input3)
{
ignore(input3);
}

关于c++ - 设计模式 : uniform interface for partially supported derived classes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4231037/

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