gpt4 book ai didi

c# - C#/C++ 中的非虚拟接口(interface)设计模式

转载 作者:IT老高 更新时间:2023-10-28 22:17:29 26 4
gpt4 key购买 nike

在设计界面时,有人建议使用非虚拟界面模式。有人可以简要概述一下这种模式的好处吗?

最佳答案

非虚拟接口(interface)模式的本质是你有private virtual函数,这些函数被public non-virtual函数调用(非虚拟接口(interface)) .

这样做的好处是,与派生类能够覆盖其接口(interface)的任何部分相比,基类对其行为有更多的控制。换句话说,基类(接口(interface))可以为它所提供的功能提供更多的保证。

作为一个简单的例子,考虑具有几个典型派生类的古老动物类:

class Animal
{
public:
virtual void speak() const = 0;
};

class Dog : public Animal
{
public:
void speak() const { std::cout << "Woof!" << std::endl; }
};

class Cat : public Animal
{
public:
void speak() const { std::cout << "Meow!" << std::endl; }
};

这使用了我们习惯的公共(public)虚拟接口(interface),但它有几个问题:

  1. 每个派生动物都在重复代码——唯一改变的部分是字符串,但每个派生类都需要整个 std::cout << ... << std::endl;样板代码。
  2. 基类不能保证speak()做。派生类可能会忘记新行,或将其写入 cerr或任何与此相关的东西。

要解决此问题,您可以使用非虚拟接口(interface),该接口(interface)辅以允许多态行为的私有(private)虚拟函数:

class Animal
{
public:
void speak() const { std::cout << getSound() << std::endl; }
private:
virtual std::string getSound() const = 0;
};

class Dog : public Animal
{
private:
std::string getSound() const { return "Woof!"; }
};

class Cat : public Animal
{
private:
std::string getSound() const { return "Meow!"; }
};

现在基类可以保证它会写到std::cout并以新行结束。它还使维护更容易,因为派生类不需要重复该代码。

Herb Sutter 写道 a good article on non-virtual interfaces我建议你去看看。

关于c# - C#/C++ 中的非虚拟接口(interface)设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6481260/

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