Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我们应该在C++;?_C#_C++_Design Patterns - Fatal编程技术网

C# 我们应该在C++;?

C# 我们应该在C++;?,c#,c++,design-patterns,C#,C++,Design Patterns,毫无疑问,decorator模式是增强类中不能(或不应该)继承旧方法的某个方法的良好且简单的标准,如C#中的示例(我不使用接口(我应该)使其尽可能短) 但是由于C++中有多继承,我们可以隐藏父亲的信息()而不是修饰它: #include <string> #include <iostream> using namespace std; class Human { ... }; class Father { public: string Info() {

毫无疑问,decorator模式是增强类中不能(或不应该)继承旧方法的某个方法的良好且简单的标准,如C#中的示例(我不使用接口(我应该)使其尽可能短)

但是由于C++中有多继承,我们可以隐藏父亲的信息()而不是修饰它:

#include <string>
#include <iostream>
using namespace std;

class Human { ... };

class Father {
public:
    string Info() {
        return "John";
    }
};

class Son : public Human, Father { // inherit both
public:
    string Info() {
        return "I am son of " + Father::Info();
    }
};

int main() {
    Son* s = new Son();
    cout << s->Info(); // I am son of John
    cin.get();
    return 0;
}
#包括
#包括
使用名称空间std;
类人{…};
班长{
公众:
字符串信息(){
返回“约翰”;
}
};
类子:公共人类,父{//继承二者
公众:
字符串信息(){
返回“我是”+父亲::信息()的儿子;
}
};
int main(){
儿子*s=新儿子();
cout Info();//我是约翰的儿子
cin.get();
返回0;
}
我知道很多模式的原因是将特殊逻辑从可重用类移动到特殊类,因此可重用类不需要(或不能)与特殊代码混淆。但这也可以通过多重继承来实现


那么,您能解释(或给出一个例子)装饰比多重继承更好的地方吗?

使用装饰器模式,您可以在运行时装饰对象,而多重继承是一种编译时解决方案。这允许您以最小的开销自由组合不同的decorator,而对于多重继承,您需要为每个decorator组合创建一个新类


此外,如果您继承的不是接口类(只有纯虚拟方法的类),则很难正确执行多重继承。

使用decorator模式,您可以在运行时装饰对象,而多重继承是一种编译时解决方案。这允许您以最小的开销自由组合不同的decorator,而对于多重继承,您需要为每个decorator组合创建一个新类


此外,如果您继承的不是接口类(只有纯虚拟方法的类),则很难正确执行多重继承。

在我看来,这不是装饰器模式,您似乎使用了错误的继承方式。在继承之前,问问自己:“儿子是父亲”这句话是否正确,或者“特定对象”是一个概括对象,这不是你想要表达的

装饰器模式通过将要装饰的对象传递给装饰它的对象来工作。一个典型的例子是Gui中的BorderClass,它用边框装饰您传递的小部件

 public class Border : Widget
   { 
       public Border(Widget decorateMe)
       { 
          this._toDecorate = decorateMe;
       }
       public virtual void draw(gc or whatnot){
          gc.drawRectangle(blah);
          this._toDecorate.draw(gc);
       }
   }

希望这有帮助

在我看来,这不是装饰器模式,您似乎使用了错误的继承方式。在继承之前,问问自己:“儿子是父亲”这句话是否正确,或者“特定对象”是一个概括对象,这不是你想要表达的

装饰器模式通过将要装饰的对象传递给装饰它的对象来工作。一个典型的例子是Gui中的BorderClass,它用边框装饰您传递的小部件

 public class Border : Widget
   { 
       public Border(Widget decorateMe)
       { 
          this._toDecorate = decorateMe;
       }
       public virtual void draw(gc or whatnot){
          gc.drawRectangle(blah);
          this._toDecorate.draw(gc);
       }
   }

希望这有帮助

我想常见的例子是数字信号处理。您希望动态组合处理器,而不是通过静态继承层次结构定义它们。当您有多个继承时,您可以使用它。我想常见的示例是数字信号处理。您希望动态组合处理器,而不是通过静态继承层次结构来定义它们。当您有多重继承时,您可以使用它。@JanTuroň:这不仅仅是编译时间。对于多重继承,您需要为可能要使用的每个装饰器组合编写一个新类。这将导致大量代码开销。只要接口合适,装饰器就可以以最小的开销自由组合,因为它们不知道装饰的内容。@JanTuroň:这不仅仅是编译时间。对于多重继承,您需要为可能要使用的每个装饰器组合编写一个新类。这将导致大量代码开销。只要接口合适,装饰器就可以以最小的开销自由组合,因为它们不知道装饰什么。我知道,我知道-我的类的名称-父亲和儿子-有点误导。也许我应该用另一个名字和方法。。。现在太晚了。我想表明,一个班级不能从内部装饰自己,要装饰的东西是传递给它的。我知道,我知道——我的班级的名字——父亲和儿子——有点误导。也许我应该用另一个名字和方法。。。现在太晚了。我想让大家明白,一个类不能从内部装饰自己,要装饰的东西是传递给它的。