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

  • 主题发起人 主题发起人 ddev
  • 开始时间 开始时间
呵呵,小弟是菜鸟,刚开始感觉讨论还可以,后面怎么就开始了呵呵,我想某些人太自大了.
 
有些人,有些话,看了真让人生气,本来我是要说粗口的,算了那样不好。就说点别的吧。
面向对象是一种思想,是一种分析方法。
那为什么又是一种技术呢??动动脑子吧。科学就是生产力。
wuliaotd:
别张扬,别说你不张扬,因为你张扬了,还有其他人,有时候,也包括我自己。
问我C如何实现对象,(夸张表情,)你开玩笑,一定是开玩笑!!
(如果你对电影没有什么理解的话,你是想象不出来,我的语气。)
Intel和AMD告诉大家了,它支持对象指令了吗?说了吗?(高点声)说了吗?
没有,是的没有说。好了,还需要我告诉你用c进行对象设计和编程吗?
java提供与delphi类似的但比delphi强很多的功能:反省。(不管你把它叫什么,
或者是别人叫它什么)
java都在反省,中国人啊,为什么不反省呢。为什么???天啊,你告诉我!
你告诉我这是为什么!!!!!
 
我工作经验不错,但至少可以反驳wuliaotdd的两个论点:
1。“有几个DELPHI项目组开发时完整的用UML画图”,我在广州凯通工作的时候,在客户端组,用delphi开发,就使用rose画uml图的,整个的设计很“OO”
2。“你们就会点Delphi,每月也拿一千多不容易啊”,还是在广州凯通工作的时候,我的确只会delphi,工资是日薪100(因为我是兼职),我们组里共6个人,我是最穷的,其中不乏月薪5、6k的。
你太肤浅了。
 
笔误,上面第一句应该是“工作经验不多”
 
有时候打口水战也能让我学到很多东西![:D][:D]
学习,收藏![:D][:D]
 
有时候打口水战也能让我学到很多东西![:D][:D]
学习,收藏![:D][:D]
 
实践出真知,请问大家在写构造器时,有多少次是把Inherited写在第一行的,又有多少次是因为忘记写这一行而导致运行期错误的??
可为什么DELPHI会使用这种灵活而不安全的方法呢,我看了点源代码,提出点想法。
在DELPHI里,绝大部分构造器都是把Inherited写在第一行的,但有几个例外,这是TCustomForm的构造器前面部分:
constructor TCustomForm.Create(AOwner: TComponent);
begin
GlobalNameSpace.begin
Write;
try
CreateNew(AOwner);
........
end
GlobalNameSpace.begin
Write;是用来进行线程同步的,而接下来的代码就会去读写一些DELPHI为我们维护的全局变量。也就是说DELPHI对程序员屏蔽了实现细节,而又用自己的方法实现了操作系统的底层机制。这是不是就是DELPHI的构造器不同于C++的原因之一呢?可能还有别的原因,仅供参考。
而理论是简单的,现实是复杂的,一个语言除了支持理论成果以外,可能为了一些实现上的原因也会导致一定程度的偏离吧。
 
在网络上发言很容易引起误解,大家没有必要发火,本来天已经很热了[:)]
关于语言的选择,我个人认为不是小问题,我指的不是语言本身,而是与之相关的一些东西,比如传统,资源,社区文化等等。我很想听听大虾们的经历和感受,但是大虾们曾经沧海之后,仿佛都欲说还休...,其实这些东西对学习编程的人是很有用的,最起码可以开阔他的视野,也有助于个人发展目标的确立和路径的选择。
如果你想骂人,出去晒太阳三小时[:D]
 
to ddev and all:
1、希望下面进行学术的探讨,我对Delphi不熟,一切是从事物的表面看问题,也许过于偏激,
但这些“事物的表面”都是客观存在的事实。
2、“面向对象”一定就很好吗?很显然,Object Pascal的结构化成份是相当浓的,但这并
不说明它就不行,对不对?不能说“面向对象”就是金科玉律,违反不得,Delphi这么优秀
自然支持得也很优秀,这种思想对于学习OOP绝对是有害的。至少,正如我所说,目前几乎
没有办法把一些主流OOD工具无缝地运用到Delphi上。那么,不管它有多么的优秀,我们学习
OOP是否一定得死抱着Delphi不放呢?
3、对于学习的态度,我一向是闻过则喜,我也以为别人和我一样,遗憾的是,别人暴跳如雷,
就拿ddev兄你来说,恕我直言,不管你多么的拥护Delphi,至少你在Java上的一些理解是错误
的,你为什么要学Java?既然你在学习Java,就不要把Delphi中的观念带进来,不要去作比较,
也不会去认定Java是抄袭的Object Pascal,就算它是真的,学习上也要认为它来自C++,
因为你一旦用Delphi的观念来理解Java,十有八九是错的。我一直在Delphi上都很心虚,
谈的都是现象(你们把这些现象归结为“非主流”,“商业”),不敢谈本质,那么,ddev兄
是否可以在Java上虚心一点呢?上面有人说我自大,我的性格是自大,但我在学问上从不自大,
我绝不会把任何东西认为是金科玉律,包括Java和OOP,包括我自己的以前的认识和观念,
相反,我一直是以怀疑的眼光来看问题,随时都可以推翻。你从我前面的帖子中细看一下应
该体会得出来,我从不相信民间流传和厂商宣传,也从不固持己见。

4、具体问题(只谈Java):
“Java 从语法上来讲,是可选择的,因为它完全可以放弃 super”,----不对。
基类的构造函数总是被首先呼叫,如果没有显式呼叫,编译器自动插入,请看Thinking in Java 上的例子理解一下。
“直接隐含了一个处理:继承构造非必须”,----不对,同上。
“如果父类的某些信息(当然是初始化例程)是必须的,这种方式就可以说是严重不安全,
甚至编译都无法通过;或者运行直接异常”----不对,你是结构化思维模式,请理解 Java 的late binding。
final分别应用于data,method和class时有不同的含义。应用于类时是为了防止继承,为什么
要防止继承呢?主要目的是安全,不过这个安全是“网络安全”“密码安全”等意思。比如,
你有一个加密和解密的类,如何允许继承的话,破解者就可以根本不需要理解你的算法,直接继承你的method用在破解程序中就行了,这是一个最直观的理解。
5、也许对于Delphi来说,我的“洗衣机”例子是错误,但你学习Java的话,很有必要理解
一下“洗衣机”,我自认为我对Java的OOP的理解是很深入的。

 
wuliaotd:
>>最后,不小心走错了地方,对不起了。我知道,你们就会点Delphi,每月也拿一千多不容>>易啊,所以容不得人说Delphi的半点不是
冲你这句就可以踹你到大西洋里去,你不是走错了地方,而是做错了人,看法人人都有,但肯定不是因为拿了不容易的一千块(拿一块都不容易何况...).小子,你拿多少给哥哥说说,哪家公司的,挺牛的嘛?不过在大富翁拿一千块的和拿十万块的都有相同的发言权,在歌厅才有不同的.
 
to xiangya:
对C的面向对象编程,不要干叫,请写一小段如何实现继承,如何实现多态的代码来! 另
外,我看的第一场电影就是用C语言来作的对白。
还有,吵架归吵架,至少自己要有点底蕴和水平,“C的面向对象编程”,我知道你是不会,
尽管你说你看过电影,你心也是虚的。“很多人”用C来作面向对象编程更是荒唐,信口开
河。我给你提个醒儿吧,Linux下有Object C,这么有利的证据为什么不吵出来?但“很多
人”如何谈起来,国内的人接触Linux的时间比接触C++的时间晚,而C++对C是全兼容的,
谁还会用一历史遗迹?东西玩过后再拿出来说,别拿无知当坦然,有种写一小段Object C实
现继承或多态?(再给你提个醒儿,Object C的Object是“基于对象”还是“面向对象”?)

to darzui:
别拿特例说话,请正视普遍现实。
 
to TigerDing:
意气之争毫无意义,我多次道歉了。
只知道生气而不会思考则是无益了,你可以把我一脚踹你到大西洋里去,却无法制止整个
Delphi圈子外的人对Delphi的一些看法和意见,也无法提高Delphi程序员的地位,正视现实
和正视自己一样的困难。
 
我想我有必要重复一遍。
有些人,有些话,看了真让人生气,本来我是要说粗口的,算了那样不好。就说点别的吧。
面向对象是一种思想,是一种分析方法。
那为什么又是一种技术呢??动动脑子吧。科学就是生产力。
java提供与delphi类似的但比delphi强很多的功能:反省。(不管你把它叫什么,
或者是别人叫它什么)
java都在反省,中国人啊,为什么不反省呢。为什么???天啊,你告诉我!
你告诉我这是为什么!!!!!
to wuliaotd:
说话之前,想想该不该说。一个建议,很好的建议。
 
事情演变到这个地步,这个帖子除了看了生气,已经没别的作用了,结了吧。
 
to xiangya:
谢谢你的建议,真的,也许不是我的性格,我的意见可能更容易接纳一些;我和你不一样,
我的意见仅仅是“elphi并不是事事都优秀,OOP支持得就很不好。”但OOP支持得不好并不是
说Delphi就不好,我没有这个判断。
-------------------------------------------------------------------
“java提供与delphi类似的但比delphi强很多的功能”,我从来没说过这种话。
-------------------------------------------------------------------
java都在反省,中国人啊,为什么不反省呢。为什么???天啊,你告诉我!
你告诉我这是为什么!!!!!
-------------------------------------------------------------------
不要激动,存在自有其道理,况且J2EE程序(不是Java程序员)比Delphi程序员的
工资高得多。
每个语言和工具都有其特定的用途,我没用过Delphi但想象得到它的一些常规用法,
J2EE的常规用处可能超出了你的知识范围,如果你认为它很糟糕,大可以用你的Delphi,
只要给你的项目组提供正确的接口就行了(如果真的可行的话)。
 
因为你一旦用Delphi的观念来理解Java,十有八九是错的<<<<<<<<<
说这话的人本身就是错的(我用delphi来理解java,这虽要从语言本身的角度来讲,面不要从它们的框架结构上来比较,很多种语言都有它们的相似话,主要差别只在于语法规则)
我不想讨论java和delphi谁强谁弱
实用领域不同,还有使用者水平的差异也很重要
我不知道安道尔斯如果用delphi能不能写出比你用java更高质量的程序出来?????
或者是我拿一把屠龙刀就可轻意砍下赤手空拳的张无忌的脑袋?????

 
to Badlucky:
不好意思,是我挑起的,遗憾的是他们不能象我这样收放自如。
何必生气呢?如果你的项目组是Delphi,你把它用好就行了;如果你在学习Delphi,先把它
学通了再说;如果你是Delphi熟手,Java生手或C++生手,不要以Delphi的角度看问题就行了。
进入一行,一行自有其最佳;对于OOP,Java更纯一些,Delphi偏向混合,这并不羞人,也不
丢脸,何必黄蟮泥鳅拉成一样齐呢?既然(delphi的OOP)书也少,工具也少,何必折磨自己呢?

还是那一句话,如果你的OOP知识大部分来源于Delphi,是Delphi的思维习惯,那么,你一定
是还没有认认真真地学习过具体的OOP技术(如UML,设计模式等)和工具(如Rose等),对
不对?不必回答,扪心自问就行了。

自我结帖,不再发言了。

 
终于明白,一个例子:
class First {
public:
First();
First(char* s);
};
class Second : public First {
public:
Second();
Second(char* s);
};
---------------------------------->>>>
Second::Second(char*s) : First(s)
{
};
<<<<<<<<<------------------------
所以必须强制为第一个语句,其实质与 C++ 完全一致!!!!
其差别只是句式上,仅仅是句式上不同!!!因为它没有:
subclass(arg) : parent(arg)
这种句式,真混帐!!!
 
to all:
没有必要为点小事呕气,其实都是为了一个目的:理解得更好。
对象编程已经是趋势所向,理解深入些,透彻些,看看别人的观点,
对照自己的不足,或者象我,发帖谈一下自己的不足,何乐而不为?
准备晚上结贴,如果没有意外。
 
我真的他妈的有点苦笑不得。
wuliaotd:小弟,不是我说你,你真的有点无聊透顶。
别说你j2ee很xx。
别和我说 机2ee。要说,好啊,
给你个题目,罗列出j2ee所涵盖的技术来,让大家开开眼界。你还可以针对这些技术,
适当做些点评其优劣。有理,大家自然会说最讨厌的“I服了U”。
你还有一个毛病,自欺欺人。
另外一个建议,不要以为全世界就你一个人。
介于你针对我说的一些话,我告诉你一些事实。我从98年开始学习java,只是学习。
我在2001年开始j2ee。不算早,也不算迟。此外,我知道我自己需要学习什么,
我也知道我能帮助别人些什么。我也知道一点中国的程序员和开发者要什么。
但是我确实不知道你要什么。
下面就是一些c代码,你可以看看。但确实不是我写的。也不能证明我会写或者不会写。
证明什么呢?证明我说的别人在写。
In C, we have to manage the vtable explicitly, and we also have to inherit from the base class vtable, so that virtual methods that aren't overridden are available to the derived class. This forces two separate inheritances: data and vtable. The public interface is the same, except for the addition of prototypes for Shape_area() and Shape_draw(), so I won't repeat it. The only changes to the private code are the new and delete methods, and the added methods:
#define VTABLE(this) ((void***)((char*)(this)-sizeof(void*)))
static void* Shape_vtable[] = {
0, 0 /* both of our virtual methods are pure virtuals */
};
Shape* Shape_new(Shape* this, int _x, int _y) {
if(!this)
this = malloc(sizeof(void*) + /* vtable pointer */
sizeof(Shape) + sizeof(Shape_private));
Shape* obj = (Shape*)((char*)this+sizeof(void*));
/* sneaky vtable hiding */
*VTABLE(obj) = Shape_vtable;
Shape_private* priv = SHAPE_PRIVATE(obj);
obj->x = _x;
obj->y = _y;
return obj;
}
void Shape_delete(Shape* this) {
free(VTABLE(this));
}
#define CIRCLE(this) ((Circle*)(SHAPE_PRIVATE((Shape*)this)+1))
double Circle_area(Circle* this) {
Circle* derived = CIRCLE(this);
Circle_private* priv = CIRCLE_PRIVATE(derived);
return M_PI*priv->radius*priv->radius;
}
double Circle_draw(Circle* this, Canvas* c) {
Circle* derived = CIRCLE(this);
Circle_private* priv = CIRCLE_PRIVATE(derived);
/* ... */
}
static void* [] Circle_vtable = {
Circle_area, Circle_draw
};
Circle* Circle_new(Circle* this, int _x, int _y, int _radius) {
if(!this)
this = malloc(sizeof(void*) +
sizeof(Shape) + sizeof(Shape_private) +
sizeof(Circle) + sizeof(Circle_private));
this = (Circle*)Shape_new((Shape*)this,_x,_y);
*VTABLE(this) = Circle_vtable;
Circle* derived = CIRCLE(this);
Circle_private* priv = CIRCLE_PRIVATE(derived);
priv->radius = _radius;
return this;
}
void Circle_delete(Circle* this) {
return Shape_delete((Shape*)this);
}
#define FILLEDCIRCLE(this) ((FilledCircle*)(CIRCLE_PRIVATE((Circle*)CIRCLE(this))+1))
void FilledCircle_draw(FilledCircle* this, Canvas* c) {
FilledCircle* derived = FILLEDCIRCLE(this);
/* ... */
}
void* FilledCircle_vtable[] = {
Circle_area, FilledCircle_draw
};
FilledCircle* FilledCircle_new(FilledCircle* this, int _x, int _y, int _radius) {
if(!this)
this = malloc(sizeof(void*) +
sizeof(Shape) + sizeof(Shape_private) +
sizeof(Circle) + sizeof(Circle_private) +
sizeof(FilledCircle) + sizeof(FilledCircle_private));
this = (FilledCircle*)Circle_new((Circle*)this,_x,_y,_radius);
*VTABLE(this) = FilledCircle_vtable;
FilledCircle* derived = FILLEDCIRCLE(this);
FilledCircle_private* priv = FILLEDCIRCLE_PRIVATE(derived);
/* would initialize new members here */
return this;
}
void FilledCircle_delete(FilledCircle* this) {
return Circle_delete((Circle*)this);
}

And finally, how to make use of our polymorphic objects: C++:
Shape* rc = new RedCircle(10,10,8);
cout << "Our circle has area " << rc->area() << endl;
rc->draw(canvas);
// draw it
delete rc;
And our C emulation (the VTABLE macro has to be made public, or perhaps an inline function could be used to wrap its use):
Shape* rc = (Shape*)RedCircle_new(NULL,10,10,8);
printf("Our circle has area %d/n", (*VTABLE(rc))[0]->(rc));
(*VTABLE(rc))[1]->(rc,canvas);
/* draw it */
Shape_
 
后退
顶部