c++中能否使用interface(如java)那样的功能?
2010-01-01 21:02
232 查看
问:
确认一下c++中不能使用interface(如java)那样的功能把
我认为是不能的,注意我说的是interface(用于java多重继承的那个,不是一般意义的接口)
我觉得是没有的,但是网上搜索说什么的都有而且人还不少…… 所以希望大家能给我一个明确的答复好么?最好能还有一些解释啦 ^_^
答:
想比较语言, 请首先熟悉两门语言。
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++的理念是,提供有用的特性, 是否应该使用是程序员考虑的事情,而不是语言设计者考虑的事情。
记住,任何语言都可以写出很糟糕的代码。
通过语言限制不一定是正确的方案。 它将产生出大量的”易培训“的“代码工人”。
确认一下c++中不能使用interface(如java)那样的功能把
我认为是不能的,注意我说的是interface(用于java多重继承的那个,不是一般意义的接口)
我觉得是没有的,但是网上搜索说什么的都有而且人还不少…… 所以希望大家能给我一个明确的答复好么?最好能还有一些解释啦 ^_^
答:
想比较语言, 请首先熟悉两门语言。
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++的理念是,提供有用的特性, 是否应该使用是程序员考虑的事情,而不是语言设计者考虑的事情。
记住,任何语言都可以写出很糟糕的代码。
通过语言限制不一定是正确的方案。 它将产生出大量的”易培训“的“代码工人”。
相关文章推荐
- 使用UltraEdit32编辑器格式化源码功能 XML、Java、C/C++、C#
- 使用UltraEdit32编辑器格式化源码功能 XML、Java、C/C++、C#
- 【C/C++开发】【Java开发】JNI的替代者—使用JNA访问Java外部功能接口
- Java DecimalFormat的主要功能及使用方法
- 比较C#、C++和Java最重要的功能
- Ubuntu下,Java中利用JNI调用codeblocks c++生成的动态库的使用步骤
- Android /Java DecimalFormat(十进格式)的主要功能和使用方法
- JAVA基础学习之IP简述使用、反射、正则表达式操作、网络爬虫、可变参数、了解和入门注解的应用、使用Eclipse的Debug功能(7)
- BlackBerry Java 应用中使用html 做九宫格功能导航
- Java程序:使用LinkedList存储扑克牌,实现洗牌功能
- 关于C++中RTTI与Java中RTTI的对比和使用
- java使用JNI调用C++代码(vs2010生成dll文件)
- 客户端使用java,服务端使用c++的corba编程环境搭建
- java使用Hex编码解码实现Aes加密解密功能示例
- 我使用过的Linux命令之swig - 把C/C++的代码嵌入Java等语言的开发工具
- java日志功能log4j模块的使用方法
- Java中JNI的使用详解第五篇:C/C++中操作Java中的数组
- 在网页中使用打印功能的Java代码
- 1.JAVA中使用JNI调用C++代码学习笔记
- MPSDK4J 是JAVA微信公平台开发SDK,没有复杂的功能,一切源于微信API,愿你会喜欢使用。-- 题记