为什么 Java 要采用 C++ 的构造模式而不是 Delphi 的?!(50分)

D

ddev

Unregistered / Unconfirmed
GUEST, unregistred user!
我们知道 C++ 采用由上到下的构造;而 Delphi 采用的是由下而上的构造。
因此,无论你愿意不愿意,在 C++ 中构造一个类时,你不得不去构造它的
祖类;而在 Delphi 中,你却可以选择性地 inherited 祖类的构造。我个
人觉得,这种模式应该更科学,原因是:如果我需要用祖类同样的参数来构造
一个类,但却要与祖类有完全不同的处理(同参数构想必肯定会是这种处理
要求),因此可以不 inherited;但在 C++ 中,无论你愿不愿意,你都得去
古文明时代走一圈,而现在,Java 却也采用这种“无选择”的构造,不禁要
问:
为什么 Java 要采用 C++ 的构造模式而不是 Delphi 的?!难道这种构造有
什么先进的地方吗?
 
是这样的,第一,在C++是需要发展的,它比Delphi要早一个时代,你如果从原始的C++的基本模型和目前delphi的架构来论证优劣,未免不够公平。现代C++,例如.net中的C++(非管理模式)也出现了类似inherited的关键字,而原来也有Default()这样的方式。所以并非你想的那么差。
第二,你现在还是Codinger的思维路线,代码紧紧贴着需求走,这在快速开发中是很常见的模式。但是,如果你开发一个长达5年甚至更长的开发(诸多版本,诸多新的应用),你就会发现建立基础类的好处,在C++和JAVA开发中建立项目的基础类,抽象类群是非常非常好的习惯。曾经在一个项目中,第一期工程bug 20%,到第二期工程可重用代码60%,bug 8% ,工期缩短到1/3,第三期可重用80%,bug3% ,工期又缩短了一些(基本根业务相关了)。C++就是这样先苦后甜的语言。
 
Delphi的类没有C++的科学
 
楼上的Crane讲得非常好嘛!
 
Java的思维方式大部分是抄袭Delphi的。语法方式是抄袭C++的。
同样有很多C++的弊端也被抄袭了去。
有很多人一提C++的缺点就受不了,好像C++是绝对完美的。C++毕竟是比较老的一门语言,历史包袱太重。
Java本来还要抄袭一些C++的特性,例如多继承(单根和多根那个好还没有定论,但现代语言Delphi,Java,.Net都采用的单根方式)。后来放弃了。
 
楼上说Java的所谓抄袭不知道根据在哪里。这暂且不提,毕竟只有Thinking in JAVA/C++而还没见过delphi的类似著作。关键是,C++确实不是完美的,也是可以遭受批评每种语言都有其优缺点,这是开发者应该去面对和承受的,所不能承受的是,一个或多个思维混乱,编程毫无框架思想,指哪打哪,到处Copy/Paste重复代码的合作者。而在VB,delphi,Java的开发人员中,这样的大有人在。
 
to Crane:谢谢你的解说。
这个问题是我在写一个类的时候遇到的:我想扩展一个 Date,如下;
package mypkg.java.date;
public class Date extends java.util.Date {

public void Date(String date) {
//在此,我想检测一个条件,如传入的日期是否是
//这样的格式:YYYY年MM月DD日,设为 condi1
if (condi1) {
my-parser(date);
}
else
super(date);
}
}
但在 JCreator 2.5 的编译过程中,出现错误提示:call to super
must be first statement in constuctor。
因此想到到这个问题。能给我解说一下为什么如果要调用 super,就必须
是第一个声明的原因吗?如何解决类似的问题?
 
>> public void Date(String date)
这应该是构造器吧?构造函数没有返回值
>>如果要调用 super,就必须是第一个声明的原因
派生类对象总是包含其完整的基类对象,构造派生类对象必须先构造基类对象
因此要在派生类的构造器中先调用super构造基类对象。

 
我想这是由于类的构造所引起的:
Delphi 是单根构造,所以一个类的父总是可回溯的,也就是说:是确定的;
而 C++ 是多根构造,因此编译器/RTTI无法定位一个 inherited 的方向,因为它在
上溯过程中是发散的,如: / | /
/ | /
O
因此必须完整构造所有的父类,才能构造子类,这样子类的继承信息就确定了。
我说得对不对?
 
1、对东西没有完全理解之前,恐怕这个对比毫无价值。
2、Delphi是一种很成功的产品,但Object Pascal却难说是一种成功的语言,事实上Delphi对面向对象的支持很初级,正如在真正的面向对象专家眼里,VB几乎完全不支持面向对象一样(VB.NET浴火重生,已经可以算得上一种面向对象语言了)。
3、你说得不对。基类对象(base object,不要和super关键字混为一谈,说父对象子对象是你理解上有误)是派生类对象(derived object)的子对象,包含于派生类对象之中,派生类往往需要访问基类的成员和方法,规定基类的构造函数首先初始化,是出于代码安全、减少bug上的考虑(Java出于代码安全方面的考虑而牺牲开发方便性和效率的地方还有很多)。它带来的的唯一不便之处是派生类无法捕捉基类构造函数的异常,你所举的例子,完全可以在构造派生类之前先行判断。
4、面向对象的分析设计、设计模式和面向对象方法学等等方面的书刊,几乎全是关于C++和Java的,而Delphi书籍除了开发还是开发,究竟是谁的面向对象做得好,自然不言自明。另外,Java和.Net一样,是一种平台,博大精深,远非Delphi可比,抄袭之说,尤其可笑,可能是用了JBuilder之后的结论吧?你从O'Reilly出版社的Java书目清单上就可以看出,Java的涵盖面实在太广了!不过,你要是用Java来开发Windows平台中的C/S程序(Delphi成功的地方),就是吃错药了,这是Java唯一失败的地方,Sun起诉Microsoft的论据之一就是:Java在除了Windows以外的所有地方都取得了成功。


 
to wuliaotd:
对你的意见,我有看法:
1、面象对象的概念
并不是因为有了 class 才算是面象对象,事实上,面象对象在任何一个语言中都存在,
面向对象是一种思想,而不是一种形式。认为有了 class 才有面象对象是一种极其肤浅
的理解(其结果仅仅是编译器或IDE机械地帮助你建立了一个“对象”)。面象对象是对特
定问题提供一种特定的解决方法,这才是面象对象的真正含义,它属于方法学的范畴。
2、封装完整性
>>事实上Delphi对面向对象的支持很初级
这句话说明:你对对象的理解有点太初级。计算机算法思想中的对象处理与实际问题领域
的处理要求总是有着差异和差距。计算机解决问题永远都只能是无限逼近,而不能完全解
决。因此,如何看待对象,如何看待对象的封装,以及如何看待“类的支持”,这实际上
只是对一个问题的两种看法。正如一把锤子,有人说它是工具,有人说它是凶器,有人说
它的工作效率太低,有人说“一把锤子足矣”。你又如何去看?
你说 Delphi 对面向对象支持很初级,并且最后以出书的量来说明:C++/Java 对面向对
象支持就已经很完整。我要说你真是“迂”,当初 VB 的书籍出疯了时候,你有没有怀疑
C++ 呢?而目前每台机器都几乎装有 Ms-Windows,你是否就说:Unix/Linux/BSD
就已经完蛋了呢?
许多人在使用 Java 的时候,最多的原因是:一次编写,处处运行;另外一个重要原因是:
有人把它描述成一种“网络语言”,它提供了丰富的网络编程环境。但似乎没有谁是因为
Java 在类处理的思想和手法上要超越 C++/Delphi 而选择了它。
事实上,对于 Delphi ,我可以这样说:该支持地,它都支持了。Delphi 用于解决某一
领域的问题,而不是万灵之药,C/C++/Java 也同样是这个问题。正如:有人认为 perl 比
C/C++ 处理起来方便,你是不是要说:浅薄呢?这仅说明在某个领域,perl 比起 C/C++
来的确有它的优势。C 的当初最原始的设计思想是为了解决系统问题,而 Pascal 更多的
却是在应用问题的描述与解决上。如果说 C++ 是为了更广泛地“支持”对象特性,如:多
重继承,非单根类继承等,Java 只是把这种思想退回到一个正确的位置:就目前而言,计
算机只能模拟某些方面的问题,而不能模拟和解决所有的问题。这恰恰与 Delphi,或者说
是 Object Pascal 的思想不吻而合。
 
你那个具体的问题可以考虑这样,写一个静态方法来返回一个Date对象。
 
我支持ddev的说法。尤其是这一句,
面向对象是一种思想。
据我所知,国内国外C++和Java的用户拿着对象的幌子做非对象的设计和编程,为数不少。
我也知道,用C语言做对象设计和编程也大有人在。
其他的就不要说了吧。
 
to wuliaotd
****************************************************************
1、对东西没有完全理解之前,恐怕这个对比毫无价值。
2、Delphi是一种很成功的产品,但Object Pascal却难说是一种成功的语言,事实上Delphi对面向对象的支持很初级,正如在真正的面向对象专家眼里,VB几乎完全不支持面向对象一样(VB.NET浴火重生,已经可以算得上一种面向对象语言了)。
****************************************************************
第一点正好用来反驳第二点,可能你对DELPHI的认识很不深入,
对面向对象的支持,DELPHI跟VB绝对不可同日而语(同时请参考你的第一个论点)
“对面向对象的支持很初级”绝对不应该是对DELPHI的评价,除非你对JAVA也是同样的评价
即使对比C++,也只有多根继承不具备(JAVA同样如此),
而这一点的必要性也早有公论。
如果你有更有力的证据,说出来讨论。

支持的xiangya和ddev的说法

 
1、我忘了这是一个以Delphi为主的论坛,本来不想发言了的。是的,我对Delphi并不很熟悉,但是你们的面向对象编程以及C++和Java语言也学习得很糟糕。
2、用C语言做对象设计和编程也大有人在。
天才!如何做继承?如何做多态?如何做迟绑定(late binding)?请不要用一个思想二字就把面向对象虚无化了,请你理解了下面五句话后再来谈面向对象好不好?
a、Everything is an object.
b、A program is a bunch of objects telling each other what todo
by sending messages.
c、Each object has its own memory made up of other objects.
d、Every object has a type.
e、All objects of a particular type can receive the same messages.
3、国内国外C++和Java的用户拿着对象的幌子做非对象的设计和编程。
C++本来就是一种混合语言(包含结构化、基于对象和面向对象),用它作非对象设计无可非议,而且许多系统级的程序一般都是结构化的,以达到最高的执行效率。Java做非对象编程就难了点了,别忘了Java里面没有可以单独存在的变量和函数,每一个成员和方法都必须属于一个类,如果这种情况下还要想方设法搞非对象设计,也属天才。你不管他对象抽象得好不好,他总得要抽象对象才行。但是,在Delphi中,我非得抽象对象才能进行编程吗?
4、关于出书这一点,ddev偷换了我的概念。我是说:既然Delphi对面向对象技术支持得这么好,Delphi又是如此的流行,那么,为什么没有任何一本讲解面向对象理论和技术的书籍是用Delphi或Object Pascal来讲的呢?为什么所有的大学的《面向对象技术》课程都是用C++或Java来讲的呢?包含有“面向对象”什么什么的DELPHI书籍中,结果往往是在介绍DELPHI的开发与使用,对面向对象技术甚少提及;而一本真正讲解面向对象技术的书籍绝不会以C++或Java语言和工具为主要篇幅,有介绍也不会超过一两章,这是为什么?
5、对于建模工具来说,为什么主流的UML工具如Rose,XDE以及borland收购了的Together都不支持生成Delphi代码呢?为什么C++和Java就能够得到良好的支持?这三大工具在面向对象开发中有什么作用不会不知道吧?如何你连UML都没有用过,就说什么面向对象开发,我只能是鄙视你了。
7、最后,不小心走错了地方,对不起了。我知道,你们就会点Delphi,每月也拿一千多不容易啊,所以容不得人说Delphi的半点不是。
 
关键是delphi不是主流,其他原因都是次要的。
 
to wuliaotd
最后一句就是找挨骂了,我和几个同事都远不止一千多,但就算六七年前还拿一千多
的时候对OOP和开发工具的认识也不象你现在这么肤浅啊

现在的小孩都怎么了,懂得不多,说话冲得很,还死要面子
不肯承认自己说错了,说话的逻辑也奇怪得很,
支持OOP 的语言和工具多得很,写书介绍OOP拿一两个主流(能有免费开发工具的更好)举例就可以了,知道思想就可应用各种工具(当然包括DELPHI)中了,他居然以此作为衡量工具是否支持OOP的标准,昏倒!给这么一说好象Smalltalk也不支持OOP了,起码支持得不好,呵呵!
“如何你连Smalltalk都不知道是什么,就说什么面向对象开发,我只能是鄙视你了。”
(借用你的句式)




 
呵呵,有人说出smalltalk来了,我补充一下,第一个实现MVC模式的就是smalltalk
哪时java还没出世,java的语义就是来自smalltalk,语法来自C++
smalltalk好像也是在虚拟机上运行的.
 
不明白大家在争论什么,不过也许有人愿意听听我对delphi和c++的比较。
我最近在做一个嵌入式系统,自然,delphi在这里看来是毫无用武之地的,c/c++以其
天然的优势几乎垄断了嵌入式系统的开发,当然不是oo方面的优势。
使用c++时,没有庞大的vcl,开始还有些不习惯,不过c++的语法简洁而优美,和delphi
的严格而优雅有不同的意味。
在我编写c++类的时候,我发现自己不自觉的在借鉴vcl的习惯,我也不认为这有什么问题
为什么delphi没有得到广泛的认同?我想是delphi在vcl方面太成功了,我想borland忽略了
一个重要的问题,object pascal没有任何其他方面的应用,只生存在delphi中,现在
borland索性把object pascal改名为delphi language.
我们好像都是技术人员,不是政客,我现在在看的本中把工程师定义为解决问题的人,
我们要做的是解决问题,当然要品论各种工具的优劣,不过剪刀和榔头各有存在的理由,
只要不要用剪刀去敲钉子就ok?
 
顶部