当前位置: 代码迷 >> 开发方法 >> 请教多态的优势到底在哪里啊
  详细解决方案

请教多态的优势到底在哪里啊

热度:931   发布时间:2013-02-26 00:00:00.0
请问多态的优势到底在哪里啊?
比如,Derivate继承自Base,有个虚函数fun()。
Base A; Derivate B,C;

A *a;
Switch(ConditionPara)
{
case ConditonA:
  a = new A;
case ConditionB:
  a = new B;
  break;
case ConditionC:
  a = new C;
  break;
}
a->fun();

上述代码感觉跟不用多态的功能差不多啊。
Base A; Derivate B,C;

Switch(ConditionPara)
{
case ConditonA:
  A a;
  a.fun()
  break;
case ConditionB:
  B b;
  b.fun()
  break;
case ConditionC:
  C c;
  c.fun();
  break;
}

感觉上述两个实现都差不多啊。而且,第二种看起来更直接,多态的优势在哪里啊?????

------解决方案--------------------------------------------------------
如果一上来就拿出A类型、B类型这类不“自然”的代码示例,或者像有些人那样为了复用一些代码而奢谈继承和多态,“为了继承而继承,为了多态而多态”,过于技术化,就会进入设计误区。

继承和多态,生活中的例子无处不在,每一分钟你想到事物概念时都自觉不自觉地应用着。中国古代的逻辑史上有一个著名的“白马非马”的谬论,公孙龙牵马要过城门,守门士兵说有规定马不让过关,公孙龙大言不惭地说“我牵的是白马,不是马”。这就好像说你写的处理“员工”的程序,对于实例化为“员工”的对象允许安排培训,对于实例化为“机关干部”的就不允许了,你说“我这个功能只对员工服务,不对机关干部”服务,这样客户一定会觉得你的脑子因为搞软件开发而变傻了(其实搞OO设计的人应该理解力更强、更灵活才对)!

如果你的编程语言可以让你清晰直观地这样表达代码逻辑,就是OOPL语言。否则,你的编程语言就限制了你的表达能力,你只能用编程语言可以支持运行的很低级的方式模拟表达这种能力。

多态是所有OOPL的基本特征。
------解决方案--------------------------------------------------------
软件开发中有一个原则叫做:开放封闭原则(OCP)
意思是对 追加功能开发,对修改功能封闭

回到你的问题上:
用多态的方案,你可以在不修改原来代码的情况下追加新的类。以扩从系统功能。

而如果用分支,每增加一个分支,你都需要对现有的程序进行修改,测试。
特别是当这个分支遍布你的软件很多地方的时候,情况更糟糕!
  相关解决方案