关于OOP(面向对象的编程)的问题 - 页 7

 
Zhunko:

瓦西里,请举个例子!

我只知道有一种情况,你需要分配内存并需要一个指针。

我相信你几乎总是可以不用它。最好不要使用手动内存管理。总有一个标准库已经解决了这些问题。


enum ENUM_CLASS_TYPE
{
   CLASS_PARENT,
   CLASS_CHILD_1,
   CLASS_CHILD_2
};

class Parent
{
   public:
      ENUM_CLASS_TYPE(void){return classType;}
      virtual string GetName(){return "Base";}
   protected:
      Parent(ENUM_CLASS_TYPE type){classType = type;}
   private:
      ENUM_CLASS_TYPE classType;
};

class Child1 : public Parent
{
   public:
      Child1() : Parent(CLASS_CHILD_1){;}
      void MethodChild1(){;}
};

class Child2 : public Parent
{
   public:
      Child2() : Parent(CLASS_CHILD_2){;}
      void MethodChild2(){;}
};

int Start()
{
   Parent* parent = new Child1();
   switch(parent.GetType())
   {
      case CLASS_CHILD_1:
      {
          Child1* ch = parent;
          ch.MethodChild2();
          break;
      }
      case CLASS_CHILD_2:
      {
          Child1* ch = parent;
          ch.MethodChild2();
          break;
      }
   }
}
 
TheXpert:
动态类型识别的存在通常表明一个项目的拐杖结构。


动态类型识别的存在表明了高度的多态性 和更高的抽象水平。它增加了项目的可管理性和可扩展性。允许你在接口层面上处理代码,并鼓励程序员不要去研究实现细节。
 
瓦西里,我认为你的例子是脱节的。有一些模板(µl中的宏),它们可以在编译时解决很多问题。而如果你必须做向下转换,你就没有很好地设计程序(甚至Straustrup也这么说)。
 
Pavlick:
瓦西里,我认为你的例子是脱节的。有一些模板(µl中的宏),它们可以在编译阶段解决很多问题。而如果你必须做向下转换,你的程序设计得很差(甚至Straustrup也这么说)。

在严格的类型控制下,下行齿轮有什么问题?斯特劳斯鲁普是在没有任何类型控制的情况下这样说的。现在,如果你知道派生类型,你可以在转换开始前保证转换,从而避免运行时的错误。

但向下转换的优势是显而易见的。主要的是,它在接口层面上工作。如果一个基类的构造函数在被保护的范围内被关闭,那么它就是一个接口和抽象类,我们可以在它的层面上工作,而不需要知道它的子类的细化实现。但是如果我们根据实例类型实现多态行为,我们肯定可以指定相应实例的实现,例如调用其独特的方法。有了虚拟函数,我们甚至不需要类型转换。毕竟,虚拟函数 会在 "幕后 "调用具体的实现。

 
C-4:

... 有了虚拟函数,甚至不需要进行类型转换。毕竟,虚拟函数会在 "幕后 "调用一个特定的实现。


我并不反对突出显示的那个人。你在这个例子中确实采取了不同的方法。
C-4:

在严格控制类型的情况下,下降的铸件有什么问题

如果你写得正确,你根本不需要它。

P.S: 我不是把Samapal类型识别和虚拟函数 机制混为一谈。

 

一个来自真实MQL应用的例子。

Дана строка таблицы состоящая из ячеек нескольких типов. Часть из них являются обычным полями текста OBJ_TEXT, часть - кнопками OBJ_BUTTON а часть - ячейками, в которых текст можно редактировать (OBJ_EDIT). Значения введенное в ячейку типа OBJ_EDIT запоминается, и в случае его корректности формируется некий приказ, который отправляется на выполнение внешней системе. В промежутке времени между отправкой приказа и получения ответа от системы необходимо заблокировать строку таблицы таким образом, что бы все ячейки с возможностью редактирования в них текста больше не позволяли вводить в них текст. Все кнопки входящие в строку таблицы не позволяли нажимать на себя, а в целом, все ячейки в которых есть текст, должны были бы изменить его цвет на красный, сигнализируя тем самым о своей блокировке. Строки входящие в таблицу не идентичны друг другу и не содержат регулярной структуры. Одна строка может содержать кнопку, тогда как другая нет. Одна строка может содержать какой-либо столбец, а другая нет и т.д.

我想听听专家的意见,他们将如何解决这样的问题。我个人使用动态类型识别、"模式法 "模式和降级转换解决了这个问题。这个问题解决得非常好,它终于使我能够用不规则的、完全可定制的元素创建复杂的交互式表格。结果是如此具体,以至于我发现声称德 "动态识别是一个拐杖 "和 "向下转换是邪恶的 "的说法是天真的。

p.s. 帕夫利克,顺便说一下,你仍然没有回答向下转换到底有什么问题。

 

不,我远不是一个专家。我所说的关于减速器的内容是我的经验,我努力这样写+它被我尊敬的人所证实。写一个程序来证明一些东西是在浪费我的时间。

帕夫利克,顺便说一句,你仍然没有回答到底是什么让裁员变得糟糕。

这很难解释。我理解,但我不能说)。书籍中可能会有更好的解释。

 
C-4:
enum ENUM_CLASS_TYPE
{
   CLASS_PARENT,
   CLASS_CHILD_1,
   CLASS_CHILD_2
};

class Parent
{
   public:
      ENUM_CLASS_TYPE(void){return classType;}
      virtual string GetName(){return "Base";}
   protected:
      Parent(ENUM_CLASS_TYPE type){classType = type;}
   private:
      ENUM_CLASS_TYPE classType;
};

class Child1 : public Parent
{
   public:
      Child1() : Parent(CLASS_CHILD_1){;}
      void MethodChild1(){;}
};

class Child2 : public Parent
{
   public:
      Child2() : Parent(CLASS_CHILD_2){;}
      void MethodChild2(){;}
};

int Start()
{
   Parent* parent = new Child1();
   switch(parent.GetType())
   {
      case CLASS_CHILD_1:
      {
          Child1* ch = parent;
          ch.MethodChild2(); // Это не ошибка?
          break;
      }
      case CLASS_CHILD_2:
      {
          Child1* ch = parent;// Это не ошибка?

          ch.MethodChild2();
          break;
      }
   }
}

即使不是错误,也有模板和typeid()。
 
Pavlick:

不,我远不是一个专家。

但Stroustrup是。其他许多人也是如此。你说的都是正确的事情。
 
不幸的是,Typeid()并不存在,而模板的优势在于静态识别。不同的问题由不同的方法来解决,说一种方法不好,另一种方法好,是一种错误的假设。