Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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++ 方法的oop继承与使对象仅在调用它的类中调用方法_C++_Oop_Inheritance_Single Responsibility Principle - Fatal编程技术网

C++ 方法的oop继承与使对象仅在调用它的类中调用方法

C++ 方法的oop继承与使对象仅在调用它的类中调用方法,c++,oop,inheritance,single-responsibility-principle,C++,Oop,Inheritance,Single Responsibility Principle,我对judge witch的方法有问题,它从设计上来说更好,干净的代码==良好的实践 我从程序启动时的文件中加载了一些数据,类的结构如下所示: 更具体地说,IngredientFromXmlReader,PizzaReader,DrinksFromXmlReader在内部完成所有工作,而不从DataFromFileLoader中插入任何数据 问号是如何使用DataFromFileLoader类,它应该继承自PizzaReader,IngredientFromXmlReader,DrinksFro

我对judge witch的方法有问题,它从设计上来说更好,干净的代码==良好的实践

我从程序启动时的文件中加载了一些数据,类的结构如下所示:

更具体地说,
IngredientFromXmlReader
PizzaReader
DrinksFromXmlReader
在内部完成所有工作,而不从
DataFromFileLoader
中插入任何数据

问号是如何使用
DataFromFileLoader
类,它应该继承自
PizzaReader
IngredientFromXmlReader
DrinksFromXml
,并具有如下方法
loadMenuFromFiles

 private void loadMenuFromFiles()
{
    this->loadIngredientsFromXml();
    this->loadPizzasFromXml();
    this->loadDrinksFromXml();    
}
这种方法:

  • 对我来说看起来更干净
  • 不要创建不需要的对象
  • 和DataFromFileLoader相比,第二种方法看起来更拥挤,因为方法是在父类中实现的
或者只是按照我正确的方式来做,他们都必须实现公共方法
loadXml()
,这是
AbstractReaderFromXml
的虚拟方法。然后我创建一个调用方法的对象

private void loadMenuFromFiles()
    {
        IngredientFromXmlReader ingreRead;
        ingreRead.loadXml();
        PizzaReader pizzaRead;
        pizzaRead.loadXml();
        DrinksFromXmlReader drinksRead;
        drinksRead.loadXml();   
    }
我为什么选择这个:

  • 更坚持单一责任原则,责任更分离,优势何在
  • 我没有机会在不需要的地方调用这个方法,因为我需要object来调用它
第三种选择是将这三个类的所有内部方法都设置为static,但我不太喜欢它。在我看来,它的应用似乎更重,我尽量避免它。当然,这是一个选择

什么方法更好

最后一件事,如果这个问题适合stackoverflow,或者它应该被提出来


我觉得这个问题中的问题描述不清楚。但我强烈建议在这种情况下不要继承钻石


继承演示了IS-A连接。在我看来,
PizzaReader
实际上不像
FileOpener
PizzaReader
使用
FileOpener
打开文件,对吗?这意味着这是一个很好的例子;TL;你没有听说过C++中应该避免的吗?@ 101010是的,我听说,但是如果我想继承这3个链接,我就不在类ActudiTraveReDeXML中制作任何虚拟方法。因此,它看起来像是在类IngredientFromXmlReader中加载RedietNSFromXML的方法,而不是这种虚拟构造loadXml@101010Thx是一个很好的论据,第二个选项比第一个更好。DR和TL的意思是什么?如果我只是链接代码,可能会更好。你说得对,PizzaReader使用FileOpener的方法,thx需要帮助,我将重构我的代码。@MyWay欢迎你。不要忘记,如果答案对您有帮助,您可以在此处将其标记为已接受。