免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: art_codes
打印 上一主题 下一主题

[C++] 确认一下c++中不能使用interface(如java)那样的功能把 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-03-23 18:42 |只看该作者
原帖由 art_codes 于 2009-3-23 17:53 发表

真实佩服的五体投地 太棒了
但是也不要把java贬的那么狠,应用方向不同吗? c++更多的是用于系统级的开发,我敢说c++软件开发的成功率平均上看来肯定是比java要低的
毕竟每种语言的使用方面不同嘛



只是一个概念而已。
唯一的区别:

java把这个概念单独提取出来,叫做interface
C++没有单独增加一个关键字,只是多了"虚基类"的概念

class virtualclass{
   virtual void f()=0;
   ...
};
然后当virtualclass里面都是=0的函数时等同于interface.

你甚至可用C来定义包含空函数指针的结构体,达到同样的效果。

论坛徽章:
0
12 [报告]
发表于 2009-03-23 18:44 |只看该作者
原帖由 OwnWaterloo 于 2009-3-23 12:26 发表
想比较语言, 请首先熟悉两门语言。
java的interface和单继承多实现是一种限制,而非增强。
interface将类限制为只带方法契约,不带任何实现。
单继承多实现限制的是由多个带实现的类继承——多重继承。

...


这个解释实在是无敌啊... ...

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
13 [报告]
发表于 2009-03-23 19:07 |只看该作者
原帖由 art_codes 于 2009-3-23 17:53 发表
但是也不要把java贬的那么狠


因为每过一段时间就会有人提到”C++怎么没有interface“,甚至”所以它不如java“, 所以心里有点不舒服 ……


原帖由 art_codes 于 2009-3-23 17:53 发表
我敢说c++软件开发的成功率平均上看来肯定是比java要低的


这我不了解了 ……
java的成功, 也许就是因为它简单(java现在也不那么简单了。 语言需要更好的完成更多功能, 就需要更复杂的特性。没有两全其美的事)。
然后恰好赶上了一个时期,之后么, 已经站住脚了,  就不容易动摇。

就像以前听到过的一段话:
你能设计出一个比structs更好的框架吗?
如果行,那又能怎样?
目前已经有这么多人了解structs而不是你的那个更好的框架。
公司大量使用的也是structs而非你那个更好的框架。
公司也容易(很便宜的)招到会structs而非你那个更好框架的人。
所以,你那个更好的框架是没有前途的

在我看来, java也差不多是这样



但其实它是一门糟糕的语言, 理由上面也说了, 他的设计者就是一偏执狂, 使用java就像是被语言设计者qiang jian。


java有诸多矛盾的地方。再举一个例子:
java采用GC, 号称内存不用操心了。

是不是有了GC就真的不用操心内存
前段时间做的一个项目, 我用C++写其中一部分, 别人用C#做另一部分, 另外有人用anction script做了一部分。
然后内存每1小时涨100M ……
首先声明,我那部分代码是反复测试过的,另外一个程序就是用的我写的那部分,跑1整天都74M不变。
我也不知道他们是怎样在有GC的环境下还能如此的泄露内存的 ……
但是C++/C程序员对资源更加警惕


同时, 是不是计算机资源就只有内存一种
GC假设可以解决内存资源, 其他资源呢?
java又不提供确定时间的析构, 又没有C# using的语法糖, 还被设计者加入一个checked exception
还有比这更糟糕的事情么?

号称自己简单, 可以管理内存, 但是确对其他资源视而不见, 避开不谈, 也不提供任何语言上的帮助。
还有比这更糟糕的语言么
james gosling简直就是一个混蛋。





举个实际例子。  你要实现一个方法, 需要依次申请3个非内存资源, 该怎么做?

这样吗???
f() {
  R1 r1 = new R1( ... );
  try {
      // do some work that may throw exception
      R2 r2 = new R2( ... );
      try {
          // do some work that may throw exception
          R3 r3 = new R3( ... );
          try {
            // ...
          }
          finally {
             if (r3!=null) try { r3.close(); } catch ( exception ) {}
          }
      }
      finally {
         if (r2!=null) try { r2.close(); } catch ( exception ) {}
      }
  }
  finally {
    if (r1!=null) try { r1.close(); } catch ( exception ) {}
  }
}

这就是java号称的使得资源管理更简单???
真搞笑 ……


或者这样?
f() {
  R1 r1 = null; R2 r2 = null; R3 r3 = null;
  try {
     r1 = new R1( ... );
     // do some work
     r2 = new R2( ... );
     // do some work
     r3 = new R3( ... );
     // do some work   
  }
  finally {
     if (r3!=null) try { r3.close(); } catch ( exception ) {}
     if (r2!=null) try { r2.close(); } catch ( exception ) {}
     if (r1!=null) try { r1.close(); } catch ( exception ) {}
  }
}
稍微好那么点。


C#里面
f() {
   using (R1 = new R1( ... ) ) {
      // work1
      using (R2 = new R2( ... )) {
      // work2
         using ( R3 = new R3( ... ) ) {
            // work 3
         }
      }
   }
}

虽然C#也没有确定时间析构, 但是C#的设计者确实在为开发者着想实实在在的为程序员提供便利
java呢?  它做了什么?


C++里面
f() {
   R1 r1( ... );
   // work1
   R2 r2( ... );
   // work2
   R3 r3( ... );
   // work3
}
那段代码更容易编写理解,和维护????


C++比java和C#更有表达力, 能更好的把程序员的意图,映射到代码上去。
但是,同时学习和使用C++也需要更多的时间和经验。
可能成功率确实不及java ……   有统计数据么?

[ 本帖最后由 OwnWaterloo 于 2009-3-23 19:17 编辑 ]

评分

参与人数 1可用积分 +10 收起 理由
langue + 10 鞭辟入里

查看全部评分

论坛徽章:
0
14 [报告]
发表于 2009-03-23 23:34 |只看该作者
原帖由 OwnWaterloo 于 2009-3-23 19:07 发表


因为每过一段时间就会有人提到”C++怎么没有interface“,甚至”所以它不如java“, 所以心里有点不舒服 ……




这我不了解了 ……
java的成功, 也许就是因为它简单(java现在也不那么简单了。 语 ...

发帖就是够刺激……但是我像问一下,向你这么一说java就做不成软件啦…… 在你看来java一切都是糟糕的…… 资源控制啦等等的
但是这个世界上确实有很多应用java成功开发的案例,说个狠的比如eclipse,这个你怎么解释呢?
我想说的就是没种开发软件也许设计的初衷不同,也许确实有缺点。但是有那么多人再用,并且也有很都优秀的软件制作出来,那在你那里出现了开发的问题,是不是可以说你还没有习惯它的一些开发特性呢?

论坛徽章:
0
15 [报告]
发表于 2009-03-24 07:55 |只看该作者

回复 #14 art_codes 的帖子

谁都有优点,谁也都有缺点。
糟糕的人未必做不成事,只不过他具备某些不那么糟糕的方面,再加上一些偶然因素,这些都促使他成功,哪怕只是短暂的成功。
但是因为他糟糕的方面太多了,我们可以预测:好景不会太长。

论坛徽章:
0
16 [报告]
发表于 2009-03-24 09:06 |只看该作者
原帖由 OwnWaterloo 于 2009-3-23 12:26 发表
想比较语言, 请首先熟悉两门语言。
java的interface和单继承多实现是一种限制,而非增强。
interface将类限制为只带方法契约,不带任何实现。
单继承多实现限制的是由多个带实现的类继承——多重继承。

--------------------------------------------------------------------------------
因为java提供的interface是限制。
所以在C++中,完全可以通过自我限制做到相同的功能。

struct interface1 {
  virtual ~I1();
  virtual void f11() = 0;
  virtual void f12() = 0;
  // ...
};
struct interface2 {
  virtual ~I2();
  virtual void f21() = 0;
  virtual void f22() = 0;
  // ...
};

/* interface more */

class base { /**/ };
class derived : public base, public interface1,public interface2 /* interface more */
{
   void f11() { /* implement */ }
   void f21() { /* implement */ }
   /* more implement */
};


楼主觉得这跟你想象中java的单继承多实现有什么区别么?


--------------------------------------------------------------------------------
同时,因为java的单继承多实现也是一种限制,
所以java里没有真正的多重继承。
C++才拥有真正的多重继承。


--------------------------------------------------------------------------------
ok,我知道你又想说,C++的这种能力确实会被用到么? 否则java为什么会被限制。

我告诉你, 这限制是james gosling那个偏执狂搞出来的。
他觉得不好的东西,他就一定要在语言中去掉,不给程序员留任何余地。
他甚至想把java的extends都给去掉(说了,他就是一偏执狂)。如果真这样,楼主还会用java么?
总之,写java代码就有被语言设计者qiang jian的感觉。 不管是goto、switch 的break,还是checked exception。


而且,多继承确实有实用价值,而且是在java的自己的sdk中。
楼主知道在哪么?
楼主用过MouseListener和MouseAdapter么??
楼主能看出这是MouseAdapte的目的是想支持的是一种多重继承可以直接支持的一种编程风格么????

学java的人多半是看不出来的。因为他们本身就在一个受限的环境中,当然不知道井外的天是什么样子。
这种编程风格叫mix-in。
ruby中仍然限制普通的多继承,但是可以多继承一个mix-in模块。mix-in模块就是带有实现的,绝不是interface。

MouseAdapter的目的就是想模拟mix-in。
但又因为java本身不支持多继承,所以开发者必须在以下两种方案中进行选择:
1. 继承MouseAdapter, 仅实现需要的listener方法。 但是, 不同同时继承于其他的类。
2. 实现MouseListener所有的方法,即使是空实现。
自相矛盾的语言。

可以说ruby在这点上,是相对于java的一种进步。
C++不但比他们出现得早,而且走得更远, 直接支持多重继承。
C++的理念是,提供有用的特性, 是否应该使用是程序员考虑的事情,而不是语言设计者考虑的事情。
记住,任何语言都可以写出很糟糕的代码。
通过语言限制不一定是正确的方案。  它将产生出大量的”易培训“的“代码工人”。

喜欢这个回复的风格,保存,待日后参考

论坛徽章:
0
17 [报告]
发表于 2009-03-24 09:10 |只看该作者
原帖由 OwnWaterloo 于 2009-3-23 19:07 发表
java的成功, 也许就是因为它简单(java现在也不那么简单了。 语言需要更好的完成更多功能, 就需要更复杂的特性。没有两全其美的事)。

这句话非常同意,许多垃圾软件就走运在这上面,许多新手也就吃亏在这上面。

论坛徽章:
0
18 [报告]
发表于 2009-03-24 10:34 |只看该作者
没想到能问出这么多东西来……
这帖子对我帮助很大 谢谢各位前辈啦 ^_^

论坛徽章:
0
19 [报告]
发表于 2009-03-24 12:52 |只看该作者
原帖由 OwnWaterloo 于 2009-3-23 12:26 发表
想比较语言, 请首先熟悉两门语言。
java的interface和单继承多实现是一种限制,而非增强。
interface将类限制为只带方法契约,不带任何实现。
单继承多实现限制的是由多个带实现的类继承——多重继承。

...


我觉得这个回复也有点偏了,就一个多继承就否定java?c++好,我们有多少人用的好呢?评价一个语言,要考虑它的效率,这个效率指的是运行的效率,开发的效率.如果你用c++10年写一个东西,用java一年就写出来,速度上java比c++慢2到3倍,绝大多数客户会选择扩大硬件来使用java来处理.你要说你写的很底层,说说我们国家有多少人写过多少底层的东西,操作系统,编译器,中间间,基本上没有,有也是更改被人opensource后的加工品.


如果只是效率问题的话,我会选择汇编而不会选择c或者c++,如果你说c++编译器可以优化的接近于汇编或者c?那么你为啥就否定jvm不能做到可以接近于c++的速度?你对jvm了解多少?写jvm与写编译器的人的水平的差距?


从我们公司来说,c++组将近有20多万行的代码,很少有用到多重继承的.从人的角度来说,这个世界,绝大多说人不是男人就是女人,半男半女的有,我的认识范围,还是少.


c++新的标准在出,从<<C++语言的设计和演化>>中可以看到,多继承这个东西,即时成为标准,标准委员会也有不一致的声音,自动垃圾回收,新的标准也考虑加入可选.标准委员会作不了的东西,不一定商业公司做不了.


有些东西是对世界的认知的哲学的东西,谁对谁错,实践证明,我们只能无线接近于事物的真相.

论坛徽章:
0
20 [报告]
发表于 2009-03-24 13:27 |只看该作者
如果你说c++没有接口,只能说明你不了解c++。

我会这么干,
class object
{
public:
&nbsp;&nbsp;&nbsp;&nbsp;virtual void destroy() = 0;
};

class output: public virtual object
{
public:
&nbsp;&nbsp;&nbsp;&nbsp;virtual int write(void *buf, int len) = 0;
&nbsp;&nbsp;&nbsp;&nbsp;virtual int flush() = 0;
&nbsp;&nbsp;&nbsp;&nbsp;virtual int close() = 0;
};
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP