五千年(敝帚自珍)

主题:【原创】JAVA和C#,武当和少林之争! -- Highway

共:💬137 🌺299 🌵10
分页树展主题 · 全看首页 上页
/ 10
下页 末页
    • 家园 好文阿。俺现在在做VB.NET呢,不过没有这么高屋建瓴地水平阿

      顺便问楼主个问题,关于T-SQL的。

      第一个关于变量定义,如何定义类似于PL/SQL

      里面那种 字段%type 的变量?

      第二个,编写了一个insert的trigger,但是要用DTS进行数据批量插入,但是DTS不能fire trigger。有什么好办法啊,BCP就可以了么?

      • 家园 老弟谬赞了。不好意思,第一个问题没有看得太懂,

        至于第二个问题,我认为是无论是用DTS,还是用BCP,缺省情况下都不会激发你的Trigger,如果想触发,试验一下下面这个方法:

        在DTS Package的Property中,uncheck Use fast load选项。不过这样速度会下降很多,请三思而后行!

        点看全图

        外链图片需谨慎,可能会被源头改

        • 家园 终于搞定

          用了BCP,加了参数-h "FIRE_TRIGGERS"。终于可以触发了

        • 家园 谢谢老大

          先写一下。刚才忙活了半天,用BCP试了一下,果然不行。老大说默认不可以,BCP有参数可以激活TRIGGER么?

          第一个问题是这样的。PL/SQL中不是有个%TYPE么,可以定义一个变量,让其绑定某个表的某个字段,也就是说它的类型和这个字段的类型相同,这样如果字段类型改了,就不用再去改程序中的变量定义了。一般都是用于SELECT的时候,存放某字段的值。据说T-SQL也支持这个功能,但是看帮助没找到相应的语法,故而来问一下……

    • 家园 昨天interview, 问我multiple inheritance

      问我什么是multiple inheritance。我回答完后,问有什么危险。然后再问:JAVA中没有multiple inheritance,那么如果要实现,该怎么做?我对JAVA不熟。哪位可以帮我解释一下?谢谢。

      • 家园 这里有个解释,你先看看:

        Q:Why doesn't the Java language support multiple inheritance?

        A: Whenever you find yourself asking why Java has or does not have some feature, consider the design goals behind the Java language. With that in mind, I started my search by skimming through "The Java Language Environment" by James Gosling and Henry McGilton (Sun Microsystems), a white paper published in May 1996 that explains some of the reasoning behind Java's design.

        As the white paper states, the Java design team strove to make Java:

        * Simple, object oriented, and familiar

        * Robust and secure

        * Architecture neutral and portable

        * High performance

        * Interpreted, threaded, and dynamic

        The reasons for omitting multiple inheritance from the Java language mostly stem from the "simple, object oriented, and familiar" goal. As a simple language, Java's creators wanted a language that most developers could grasp without extensive training. To that end, they worked to make the language as similar to C++ as possible (familiar) without carrying over C++'s unnecessary complexity (simple).

        In the designers' opinion, multiple inheritance causes more problems and confusion than it solves. So they cut multiple inheritance from the language (just as they cut operator overloading). The designers' extensive C++ experience taught them that multiple inheritance just wasn't worth the headache.

        Instead, Java's designers chose to allow multiple interface inheritance through the use of interfaces, an idea borrowed from Objective C's protocols. Multiple interface inheritance allows an object to inherit many different method signatures with the caveat that the inheriting object must implement those inherited methods.

        Multiple interface inheritance still allows an object to inherit methods and to behave polymorphically on those methods. The inheriting object just doesn't get an implementation free ride. For an excellent discussion of interface inheritance, read Wm. Paul Rogers's "Reveal the Magic Behind Subtype Polymorphism"

        简言之,任何一个Java Class,只能extend一个Class(一个父亲),但是它可以implement多个Interface。这样Java实现了OO得多态性,而又避免了C++ multiple inheritance造成的问题(Complex, hard to read, understand and maintain)

    • 家园 花!深入浅出。受教受教。

      鄙人对托管编程(managed code)所知甚少,一直搞不懂,这delegate和interface个是什么意思。俩个都是很笼统的词,到底是怎么定义的?

      谢。

      • 家园 班门弄斧一下

        这两个概念同managed code关系不大,基本上还是OO的概念。

        delegate是指一个class object调用另一个class object的功能来提供自己的功能。本质上是Composition(或Containment,Layer)。

        interface是指提供与parent class相同的接口。本质上是Public-Inheritance.

        这就牵涉到OO的几个fundimental的观点。OO的基本教义派认为,

        1)Public-Inheritance是严格的IS-A关系,也就是说如果两者是公共继承关系,derived class必须拥有parent class的所有特性。All or None, 要么继承所有接口和功能(derived class可以override parent class的virtual method),要么就不能继承。换言之,parent class必须是derived class的一个子集。

        一个著名的例子就是,长方形(rectangle class)同正方形(square class)不存在Public-Inheritance关系,虽然数学上后者是前者的特殊情况,因为正方形(4边一样长)同长方形的长宽可以不一样长的特性矛盾,所以他们不是IS-A关系。

        因此,Public-Inheritance是很严格的,按照Scott Meyers和Herb Sutter的说法,除非是严格的IS-A关系(而不是IS-ALMOST-A),不应该使用Public-Inheritance。

        2)然而现实世界,具体编程的时候,往往大部分情况下,两个class object之间不存在这种IS-A关系,而常常是一个class需要用到另一个class的某些功能,或两个class拥有某些相同功能,一个class可以利用另一个class的相同功能来实现。这种情况下一般有两种方法,一种就是Composition,即HAS-A关系。一个class object包含另一个class object,通过调用被包含的那个object的功能来提供自己的功能,这种方法叫做delegate。另一种方法叫做Private-Inheritance。

        3)除了Composition的HAS-A关系外,class object之间还有一种IS-IMPLEMENTED-IN-TERMS-OF关系,就是两个class的某些功能相同,你希望利用一个class现存的功能来完成另一个class的功能。这种关系当然可以通过Composition来实现,也可以通过Private-Inheritance来实现。一般而言,私有继承目的在于继承parent class的功能而不是Interface,所以很少需要override parent class的method(但不绝对)。

        Composition同Private-inheritance本质上没有多大区别,都能够达到相同的目的,然而几乎所有的C++ experts都prefer composition to private-inheritance。具体原因这里就不细说了,请参阅Scott Meyers的Effective C++。一个重要原则是凡是能用Composition的地方绝不要用private-inheritance,除非是不得不如此(比方说你的derived class需要用到parent class的一些protected member)。

        由此可见,在具体编程中,delegate(Composition)的使用频度大大超过interface(Public-Inheritance)。而在不存在严格IS-A关系的情况下,用Public-Inheritance来替代Compositon,本质上是violate the fundimental laws of OO Programming的,虽然从功能实现角度上讲毫无问题。

        关键词(Tags): #Composition#Inheritance#OO元宝推荐:铁手,
        • 家园 说得很不错,鲜花一朵。不过呢,

          我感觉着poorfat是问的一个非常实际的编程问题,不是想澄清OO的概念。

          在.NET中,delegate是一个关键字,interface也是。而在Java中则没有delegate这么个东西。

          这两个东西人们之所以放在一起比较是因为他们分别是.NET和Java里面Handle event(以及Callback)的核心机制。Event-driven是现代计算机语言的一个必不可少的东西。在具体实现这一点上,Java和.NET区别很大。等过两天我想和大家聊聊这个问题,如果可能的话连Function Pointer也一起捎带上。

          • 家园 读完主贴的感觉是意犹未尽。哈哈,老大原来把尾巴藏这儿啦。

            这实在是个不太好探讨的话题。就全局议可能泛泛而谈,就局部讲则可能过于精深。

            自己是个半路出家的,没有什么精深的见解,也只能泛泛的说一说。

            这可能和打仗时选用兵器一样,大刀还是长矛,特点不同,玩法当然不同。

            就个人而言,在关心其技术特点的同时,则更看重从工程开发角度的分析。

            当然,系统构成、客户需求、成本预算等等,最终也会左右开发语言的选定。

            谢谢。

          • 家园 delegate只是一个shortcut而已

            指从功能上说。Java里面的anonymous inner class实际上就是delegate。只不过Java增加inner class的时候,已经很难再改JVM Spec,所以要在编译器这一层把inner class都转换成一般的class,所以编译后一大堆分开的class,看起来怪怪的。

            另外AOP里面的mixin实际上也是提供实现delegate的另一种方便途径。

          • 家园 几点浅见

            Java从没做过,C#/DotNet刚开始涉及时间不长,倒是写了N年的C++,现在还在写。继续班门弄斧。

            我个人感觉delegate更自然和强大灵活一些。

            delegate相当于函数指针,但又是type safe的。我的理解是等于把函数当作object用,有点像把STL里的Functor抽象出来加了个关键词。

            Interface没什么新鲜的,本质上就是abstract class(在C++/COM中是用pure virtual function实现的)。C#这里抄了Java的,Single-inheritance, multiple interfaces。

            Interface是通过override interface来实现callback的,caller利用Interface的method callback,而callee则会调用具体的concrete class中被overidden的method(你自己的实现)。delegate是直接调用另一个函数,更简洁明了。

            回到概念问题,为了callback,不得不extend interface,而有时候这两者没有IS-A关系,只能说是一种从权。相反delegate更自然,直接给出一个函数当作object使用,并克服了C/C++中函数指针的缺点。

            还有一个区别,Interface对于每个具体的concrete class只能有一个实现,而delegate可以有多个,还可以dynamic,所以后者更强大一点。

            元宝推荐:Highway,
            • 家园 无斋兄大概是一直用C/C++的,所以觉得

              delegate这种type safe的function pointer更好用。

              我是从java开始走向面向对象的设计的,个人感情更喜欢用interface。我觉得delegate就是interface在某些设计中的简化使用,主要是在事件处理上方便简洁很多。而大多数设计方案中,使用interface会更加清晰。interface当然可以用纯的abstract class代替,但java把它单独分离出来,还是想强调“面向接口编程”的重要性吧。C#中也保留interface应该能说明问题。

              莫非在技术上也有“屁股决定脑袋”的说法不成?呵呵。

              关键词(Tags): #interface
分页树展主题 · 全看首页 上页
/ 10
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河