Bha*_*kar 87 java interface multiple-inheritance composition
如果我有两个接口,两者的用途完全不同,但是使用相同的方法签名,我如何在不强制编写一个为两个接口服务的单个方法并在方法中编写一些复杂逻辑的情况下创建一个类.检查正在进行调用的对象类型并调用正确代码的实现?
在C#中,这被称为显式接口实现所克服.Java中有没有相同的方法?
jjn*_*guy 73
不,没有办法在Java中的一个类中以两种不同的方式实现相同的方法.
这可能导致许多令人困惑的情况,这就是Java禁止它的原因.
interface ISomething {
void doSomething();
}
interface ISomething2 {
void doSomething();
}
class Impl implements ISomething, ISomething2 {
void doSomething() {} // There can only be one implementation of this method.
}
Run Code Online (Sandbox Code Playgroud)
你可以做的是用两个类组成一个类,每个类实现一个不同的接口.然后那个类将具有两个接口的行为.
class CompositeClass {
ISomething class1;
ISomething2 class2;
void doSomething1(){class1.doSomething();}
void doSomething2(){class2.doSomething();}
}
Run Code Online (Sandbox Code Playgroud)
gus*_*afc 13
在Java中没有真正的方法可以解决这个问题.您可以使用内部类作为变通方法:
interface Alfa { void m(); }
interface Beta { void m(); }
class AlfaBeta implements Alfa {
private int value;
public void m() { ++value; } // Alfa.m()
public Beta asBeta() {
return new Beta(){
public void m() { --value; } // Beta.m()
};
}
}
Run Code Online (Sandbox Code Playgroud)
虽然它不允许转换AlfaBeta为Beta,但是转发通常是邪恶的,并且如果可以预期Alfa实例通常也具有Beta方面,并且由于某种原因(通常优化是唯一有效的原因),您希望能够将其转换为Beta,你可以做一个子接口Alfa与Beta asBeta()它.
Mic*_*yan 11
如果您遇到此问题,很可能是因为您正在使用继承,您应该使用委托.如果您需要为相同的基础数据模型提供两个不同的(尽管类似的)接口,那么您应该使用视图以便宜的方式使用其他接口提供对数据的访问.
举一个具体的例子对于后一种情况,假设你要同时实现Collection与MyCollection(不继承Collection,有一个不兼容的接口).您可以提供一个Collection getCollectionView()和MyCollection getMyCollectionView()函数,它们提供轻量级的实现,Collection并MyCollection使用相同的底层数据.
对于前一种情况......假设你真的想要一个整数数组和一个字符串数组.相反,来自继承的List<Integer>和List<String>,你应该有类型的一个成员List<Integer>和类型的另一名成员List<String>,并指那些成员,而不是试图从两个继承.即使您只需要一个整数列表,在这种情况下最好使用组合/委托而不是继承.
| 归档时间: |
|
| 查看次数: |
37467 次 |
| 最近记录: |