物体
生物
高级生物
人,外星人
中国人,美国人,日本人|火星人,宇宙人,那美克星人
做A事用A1方法,有中国人各种特有属性,各种属性决定行为和方法|做V事用V2方法(美国人从来不做A事,也不从来不去思考A1方法),有美国人各种特有属性,各种属性决定行为和方法|..........如果以此类推的话,我们就根本没有办法在比较抽象的层次(比如 高级生物层)去定义接口.因为他们各种人的行为都是不同的.你无法定义一个抽象方法 A1.  因为这个方法 [美国人] 根本就无法实现,那就更别提外星人,外星人在生物构造上都和地球人不同 还别说行为准则.
那么.这就引发一个问题:这个模式下的 软件工程是否还可以[面向对象]?
如果答案是 : 抽象类 继承的话.
那么,我们常用的接口方法,多态,通过接口动态加载实现方法 等等均无法实现.  因为: A1方法 美国人根本不实现.那么,是否要细化设计呢?
比如 中国人 有中国人的抽象类 (甚至各省人都有各省人的抽象类),这个抽象类继承于实体类[人];[人]再继承于实体类[生物]...
这样的话,如果调用 I中国人.A1(); 的话 OO的思路得以实现了,实现A1方法的类都可以动态变更.
但新问题又来了.如果这样的话,那接口岂不是多如牛毛,在主调用的类里面充斥着大量的接口反射代码.这样的话相比面向过程式(设计巧妙的)编程还有优势吗?  -- 或者说我们要半面向对象 ,半面向过程?
我还讲一个例子:
程序
通信程序
对通信做操作
发送,接收,处理消息这个例子直接单接口就可以实现. ICORE接口,下面挂3个方法,1-send;2-resv;3-process
我讲这个例子的目的是为了说明:这个规模的软件,用OO就是太合适了.然后我再发一个链接:
http://topic.csdn.net/u/20100331/14/6c00a5f8-d753-4407-9cc8-ce19af605588.html
有人说我是疯子,我不知道看了我这篇还有没人说我是疯子...

解决方案 »

  1.   

    Isend Irecv和Iprocess 有必然联系嘛??
      如果我是个UDP的服务器只要接收和处理 那我保留Isend有意义嘛??? 所谓抽象出他们相同的东西 而具体实现不同的事情.  对于 人这个例子 为什么我不会抽象一个  human父级抽象类 然后再单独定义一个 IA来适应不同的子级类??  非要把IA也要看作是human的共性那??? 你这个不是抽象粒度 是你认知范围有限
      

  2.   

    我记得有人很妄想,它反复发了好几了帖子,他说他要顶一个方法,这个方法有一个string参数,然后要求这个方法根据这个string参数动态地创建各种各样的对象出来。我就说他很闲得没事,最好先做出各种各样具体的软件,先知道自己想做出具体的什么并且实际去做出一些东西,然后再想“万能”的空话如何实现的问题。
      

  3.   

    哈哈。如果一个包含string的方法是万能的话,那么这个方法本身也是多余的。
      

  4.   

    我不知道楼主所说的“面向过程式(设计巧妙的)编程”到底是指什么,c++指针或者是一个string包含世上万能的参数和返回类型?这就算巧妙了吗?这比“编译器可以识别接口并正确编译出方法指针来”这种传统的OO语言处理接口的编译方法,巧妙吗?
      

  5.   

    好像是仇恨贴...回答sp1234的疑问:
    你是否能够区分使用接口跟进行反射的区别呢?
    使用接口:
    ICORE ic = (ICORE)动态实现类;  然后在ic.接口方法
    反射:
    通过传递进来的 类名称 动态的创建 这个类的对象,当然,这个类的类型就是 之前已经知道的接口名称.  好像还可以不知道接口名称,连类型名都可以动态的获取(这个我没实践过)
    多的不谈了,再谈 所谓 反射,接口方法,接口是否能继承于普通类,抽象类是否能继承于普通类 就陷入细节了.我意思是那个意思,硬抠言辞错误的话 其实还很多地方有问题,比如我上面本来说的是抽象类,我下面又说的是接口方法.这样抠就没意思了.我的意思是:按照  中国人,....  各种人的不同,他们各有各的 方法,A1,B1,C1....
    他们的方法都是 后续需要调用的. 
    因为 美国人根本不实现A1方法.所以 他就根本不能继承 生物/高级生物/人 这3个接口.因为不可能从 最上面的3个接口中定义出以后可能会用到得方法.所以就必须从 比较细微的单元开始设计.  比如:从 湖北省武汉市人 作为粒度的点开始设计 Ihubeiwuhanren
    然后以此类推设计各种这样的接口.我的意思是这样的话接口数量就会很庞大.
    我的意思是:迟早会有一种软件需求要违背OO基本理念:接口的数量不能太多(具体不能超过多少我没记住,也懒得去查.)
    我的意思是:这样的OO还有必要吗?
      

  6.   

      到底是美国人不实现IA1这个接口 还是不能继承  人这个抽象类?????? 你自己都没搞明白怎麼来抽象....  你应该来发帖询问 到底要怎麼来抽象你上面的例子,而不是在这里用自己的半桶水来质疑OO思想
      

  7.   

      因为JS是解释性语言,他可以用json来序列化一个伪类对象 然后在解释生成,但对于强类型编译型语言 这从原则上是不可能实现的。 除非你做一个超级无敌大工厂模式,造出你这个超级无敌父类(但对于变异的子类这个有什么用那?? 就像object类 对于你自定义的类有么子用嘛??)
      

  8.   


    估计你也只遇到过 我下面那个通信程序 里的 ISEND,IRESV,IPROCESS 这样复杂度的应用.
    1-5 个接口,每个接口1-5个抽象方法.你以为任何应用都能照搬这个OO模型么?
      

  9.   

    并且,美国人有美国人的行为准则.
    我让你定义 IPeople ,让你定义IPeople里5个方法.但这有意义吗.在将来的应用里面.
    你需要的绝对不可能是 仅仅 
    IPeople ip = (IPeople)中国人
    ip.方法1;
    ip.方法1;
    ip.方法3;
    ip.方法4;
    ip.方法5;
    这样傻瓜的应用.你很可能需要用到
    中国人.专有方法1
    ...
    中国人.专有方法n你这样还这么做IPeople这个接口?还有什么意义?
      

  10.   

      当我在聊QQ的时候,我其实并不要知道对方是不是一个人妖,对不对?? 只要对方可以实现 IUseQQ接口就OK了,但是我要是要和她搞网恋,那我就要确认他是不是一个女人是否实现 IFemale接口,在你看来真正要用到中国人的地方其实只是用到了I中国人.专有方法1接口而已,对于对方到底是不是中国人或是美籍华人都不重要 对不对???环境决定应用.
      

  11.   


    你的回答还是 没有回答到我 设问的本质:
    1-5 个接口,每个接口1-5个抽象方法.
    你以为任何应用都能照搬这个OO模型么?10个接口以内, 每个接口10个抽象方法以内(不够?那双倍如何?)
    OO思路设置这么个门槛没错吧.但什么是应用?应用就是某种情况下 如你所说的:必须要实现某某方法的时候,在这个时候 我断言:你必定会违反上面的约束(10个接口以内, 每个接口10个抽象方法以内)如果违反这个原则,那么这样的OO是什么OO?
      

  12.   


    无语了.你1个问题1个问题先回答吧.
    首先第1个问题:
    1-5 个接口,每个接口1-5个抽象方法.
    你以为任何应用都能照搬这个OO模型么?然后第2个问题:
    如果无法实现,那么就会出现需要定义  100个接口的情况.
    这样离谱的情况 你是继续去细分功能呢 还是做其他选择?
    对第2个问题 我先说点我的观点:
    这样的情况绝对有.
    比如开发网络游戏.据我所知,现在的网络游戏都是比较硬编码的.也就是说 他们虽然有时候用了OO特性,也有抽象类C++实现的.
    但他们很多都是硬编码的.绝对没有全面按照[面向对象]的思路去实现游戏服务器的世界.换个话来讲:如果一个网络游戏服务器的代码需要做完全的面向对象编程,那么我想,其接口可能可以人为的控制在10个以内.但其抽象类可能是相当恐怖的.所以,可能会有一种折中的 [半OO]式代码出现.
    一个网络游戏的服务器如果抽象点讲不过就是  : 处理客户端 发过来的指令 而已.但是,这绝对不是几个接口和几个抽象类就能搞定的. -- 如果你要OO的话.相反,网络游戏世界里 可变化的代码相对比较少.所以较多的情况下里面的设计都是 面向过程 或者说采取了部分面向对象方式来进行.我没太多时间去整理自己的思维和发贴子的措辞.你们当中指正我的许多观点我本身就理解.
    其实我的帖子也只是想交流意见.也只不过是想说明:有时候抽象出来 4-5个方法根本不管用. 因为这4-5个方法无法覆盖到我们的应用. 我们的应用可能是 1000个方法,而且这1000个方法都已经经过抽象提炼了.而我们不可能说为了1000个方法去创建100个接口.
      

  13.   


    LZ我觉得你的说法有点抬杠了。
    不知道你想说什么。sp1234的意思是,脱离了具体问题空谈是没有意义的。任何程序都必须有硬编码。
    没有具体的情境,谈不上良好的设计,也谈不上糟糕的设计。
    只有通用的框架库才会对于设计极端饥渴。也只有内核、运算程序、模拟器/解释器,才会对性能极端饥渴。只有一些特定的软件,才会要求0缺陷。就是软件本身,也受到了人力成本、市场等等的制约。如同从绝对意义上说,太空材料比铝合金好,但是做一辆100000元的自行车却是决策的失败一样。至于折衷,本身也没有对错。只有你把不需要保留的舍去了,把应该保留的留下了,这样的折衷才是对的。相反,虽然也是“折衷”,但是比不折衷更糟。至于取舍什么,还是要具体情况具体分析。
      

  14.   

    LZ消消气,你说的也没错。大家说的也有道理。问题是,这个问题我看讨论的差不多了,再讨论也没有意义了。LZ要想具体探讨,不如透露下你在开发什么样的网络游戏。把UML贴上来。你的团队是什么情况,现有的工作做了什么,预算、工期多少。困难在哪里。