如果这两的interface是实现一样的功能的话就写一个好了,如果有区别的话就要用类限定,同时实现两的函数了。
解决方案 »
- 疑难杂症
- String equals写法
- 急急急:java中如何让Label透明???
- 在eclipse中如何导入自定义包
- java飞屏制作
- 初学者遇到问题~Exception in thread "main" java.lang.NullPointerException
- 关于异常处理机制,大家有空进来看一看。。。。
- 请问哪里可以下到较新的java API 中文帮助文档 CHM
- 用calendar类,知道日期,如何判断是最后一个星期??急!!!!
- 我用VJ++做的Applet,在VJ++运行他所在的工程下能正常用IE浏览,但单独运行包含Applet超文本文件时,Applet却显示不出来,请各路高手不吝赐教。小弟在此先表感谢。
- 关于java里面的数组! 在线等!!!
- 使用java实现串口编程,how to do it
如何用类限定?能否给出示例代码?
interface IA{
public void test() ;
}interface IB{
public void test() ;
}public class TestI implements IA, IB
{
public final static int A = 0 , B = 1 ; int InterfaceNo = A ;
public static void main( String[] args){
TestI t = new TestI() ;
t.setI( A ) ;
t.test() ;
t.setI( B ) ;
t.test() ;
} public void setI( int InterfaceNo ){
this.InterfaceNo = InterfaceNo ;
} public void test(){
switch( InterfaceNo ){
case A :
testA() ;
break ;
case B :
testB() ;
break ;
}
} private void testA(){
System.out.println( "Here is in A") ;
}
private void testB(){
System.out.println( "Here is in B") ;
}
}
顺便问一下北极星, 偶是菜鸟哈, 甚么叫adapter模式 ?
如果有另外一个接口UserScript是实现用户脚本的功能,它也有一个Run()的函数(当然还有其他函数).那么,我要写一个支持多线程执行用户脚本的类,是否需要同时实现Runable和UserScript接口?试问一下,现在该怎么办?
不过我没用过。
C++是怎样做的,能否给出示意代码?
难道没有一个java高手会吗?
你到C++版问一下,肯定答复很多啦
呵呵
java中的接口的定义就是在接口中声明的函数都是虚函数
既然是虚函数了
你显然要重新定义它嘛
public interface UserScript {
public void run();
}//Filename: SomeUserScript.java
public class SomeUserScript implements UserScript {
public void run() {
System.out.println("I'm SomeUserScript.");
}
}//Filename: UserScriptAdapter.java
public class UserScriptAdapter {
private UserScript fUserScript = null; public UserScriptAdapter(UserScript us) {
fUserScript = us;
} public void runScript() {
System.out.println("I'm UserScriptAdapter.");
fUserScript.run();
}
}//Filename: SomeClass.java
public class SomeClass implements Runnable {
private UserScriptAdapter fAdapter = null; public SomeClass() {
fAdapter = new UserScriptAdapter(new SomeUserScript());
}
public void run() {
} public void runScript() {
fAdapter.runScript();
}}SomeClass is what you want.
谢谢你详细的答复,但是我觉得还是不能满足我的要求。我需要的形式是:public class SomeUserScript implements UserScript,Runable{
........
}
COM中解决就要比java中容易的多。同时shingle(迅恒)的解决方案不是很符合OOP的设计观念,而是典型的C语言设计风格的,用switch语句而不是多态性来实现的。
#include <iostream>
using namespace std;class IA
{
public:
virtual void print()=0;
};class IB
{
public:
virtual void print()=0;
};class IAA:public IA
{
public:
virtual void printA()=0;
void print()
{
printA();
}
};class IBB:public IB
{
public:
virtual void printB()=0;
void print()
{
printB();
}
};class test:public IAA,public IBB
{
public:
void printA()
{
cout<<"IA interface\n";
} void printB()
{
cout<<"IB interface\n";
}
};int main()
{
IA *ia=new test();
IB *ib=new test();
ia->print();
ib->print();
return 0;
}
我的意思的是加强封装,提供类似于QueryInterface()的接口处理技术。
其实接口只是要求你有这样一个方法
如果两个接口都有一个相同的方法
那你只要实现一个就可以了
否则使用类型上朔吧
其实接口只是要求你有这样一个方法
如果两个接口都有一个相同的方法
那你只要实现一个就可以了
否则使用类型上朔吧
由衷感谢各位给我这么多的提示!!!
但是,不知道是不是我理解的不好,我觉得还是没有解决我的问题。我再次阐述我的问题:
1.有两家公司A和B分别定义了两个接口IA和IB,两个接口功能上没有任何关系,只不过在互相不知道的情况下有一个函数定义完全相同(假设为 void Run())
2.我所在的公司C决定开发一个类CC,同时实现IA和IB,但是这个类是由另两家公司D和E使用(或许有更多),公司D只知道类CC能够实现IA接口,公司E只知道类CC能够实现IB接口。
3。现在需要把类CC封装成外部使用时只需要按照下面的形式即可:
公司D使用时:
//in MyApp.java
public class MyApp{
public static void main(String[] args){
IA a=new CC();
CD d=new CD();
d.DoSomethingWithIA(a);
}
}//in CD.java
public class CD{
public void DoSomethingWithIA(IA inputA){
inputA.Run();
..........
..........
}
}公司E使用形式与公司D相类似,总言之,就是他们不需知道类CC原来已经同时实现两个接口,为了使用其中一个接口,还要额外设置一个标志。以上就是我的问题的完整叙述,请各位哥们继续讨论。
1.封装的概念部清楚。
对类CC而言,提供的服务是一个还是两个
调用CC的类,只关心cc提供的服务,而不必关心内部的实现。
2.如果是提供两种不同的服务,重载或用不同的method name
3.如果是提供一种不同的服务,不用说了
1.对类CC而言,可以同时提供两个服务
对调用CC的类,没错,我就是要他们不必关系内部的实现,所以才觉得shingle给出的“曲线救国”的方法不能满足要求,我的要求请见上面的第三点2.我不能用不同的method name,因为接口定义不是我设计的。我只是负责接口的实现。
偶上次所说的那个标志的设定并不是以参数的形式直接放在你所要实现的接口中, 而是另外写一个专门设置的函数,你所要做的是每次调用正确的接口方法实现前先调用设置标志的函数,这样, 虽然多了一个函数, 但是能达到你的目的.不过这样的话, 如果你实现的接口是别人用到的话, 别人就得遵守你的这个事先调用set标志的函数的默认约定
两个接口IA和IB定义了要求内涵不同的函数run()要同一个类CC实现,那么在这两个接口声明的时候,无论如何须通过某种途径通知CC说,你的run()必须要跑“我”要求的内涵,否则CC根本就无从识别,即使用C++也需如此。如果IA和IB在声明的时候可以有个信息传递给CC,比如IA ia=new CC("IA"),那就好办,就可以用 shingle(迅恒) 的方法,否则你总得有个途径通知CC啊。既然IA和IB是改不了了,就必须在CC上设计一个接收和区分IA或IB的方法。
如果知道,有办法
比如IA a = Factory.getInterfaceIA(some param);
IB b = Factory.getInterfaceIB(some param);or CC c = new CC();
a = Factory.getInstanceIA(cc);
...替代 IA a = new CC();
IB b = new CC();
如果知道调用者,该怎么办?
--------------------------
class UserScriptImplement implements UserScript {
public void run(){ run something... }
}
class RunableImplement implements Runable {
public void run(){ run something... }
}
public class SomeUserScript {
public void run(Object o) {
if (o instanceof UserScriptImplement || o instanceof RunableImplement)
o.run();
else
return;
}
}
--------------------------
我觉得应该用类的合成,而不必强行。
这个跟接口应该没有多少实质的关系了,要不就用Factory方法,用不同类来实现不同的接口;要不直接在这个方法中作判断,根据传进来的开关变量实现不同的功能。
同意 i_am_biubiu(Biubiu) 方案!~
zosatapo()的方法符合oo的基本原理,不过可能是由于“四人帮(GoF)”的影响使java地解决方案更偏向i_am_biubiu()的风格。(当然相对而言也更为灵活一些)
kkhui()到是一种别开生面的做法,在特定的环境(经验比较少,还想不起来那里会用到。也许接口种类比较固定,而需要工厂除了创建外还必须负责其他职能的时候?不过你的需求也很特别)下可能也是一种好的解决办法。
接口应该是你定义的,由你主导
当两个公司的不同品牌不同尺寸的鞋拿给你穿时,你会怎么办?修改自己的脚以让它能同时适应两双鞋?
外部要求的接口,需求不同而方法产生歧义时,你就不应该同时实现两者了
你应该采取一种桥接的方式,使用不同的Adapter,大不了再在Adapter上做一层接口,以满足各自的要求--当然,这是一种欺骗:)
Otherwise, you could use nested class.Class A
{
private Class AA implements IA{public void test(){...};}
private Class AB implements IB{public void test(){...};}
}Actually, as long as the interfaces are well defined. You can choose whatever the easiest way to implement them.