Java 接口方法的自定义实现
在这个场景中我有一个疑问,我在这里发布了一些示例代码Java 接口方法的自定义实现,java,Java,在这个场景中我有一个疑问,我在这里发布了一些示例代码 public interface a{ public void m1(); public void m2(); public void m3(); . . . public void m100(); } public class A implements a{ public void m3(){
public interface a{
public void m1();
public void m2();
public void m3();
.
.
.
public void m100();
}
public class A implements a{
public void m3(){
// implementation code
}
// Here i need to implement only m3() method but not all 100 methods
//basically i have to implement all the other 99 methods
// but here i don't want to either implement or provide skeleton declarations for all
//remaining.... what should i do for compiling this ????
}
有人能帮忙吗?我建议创建一个名为
AbstractA
的抽象类,它实现了接口a
,但其所有方法的实现都为空。然后让每个实现类扩展AbstractA
我还想知道,为什么您有一个包含所有这些方法的单一接口,而这些方法并不都是由实现接口的每个类实现的。这里几乎肯定有一个核心设计问题。您可以编写元代码,编写一个程序来编写99个抛出NotImplementedException的方法
或者,您可以将“a”作为类而不是接口(可能是抽象的),并对其进行扩展,只实现您需要的功能。缺点是,如果您这样做,您的类就不能扩展任何其他类,因为Java不支持多重继承 解决此类问题的常见方法是创建实现接口的基类,并为所有方法提供存根实现 您可以在Swing中看到这一点,例如类或类是
操作
接口或MouseListener
接口的琐碎实现,这些接口旨在使其更易于实现。为了在您的案例中实现这一点,您可以提供一个类AbstractA
public abstract class AbstractA implmements a
{
public void m1() {}
public void m2() {}
///... and so on
}
然后创建实际的类
public class A extends AbstractA
{
public void m3()
{
//your implmentation
}
}
除非实现类A或A的某个超类中的所有100个方法,或者至少将它们作为抽象方法存根,否则A不会实现接口A
如果你真的想把每个方法的逻辑分离出来,这样你就不必在一个类中实现100个方法(这将是丑陋的),请考虑策略模式。 M是定义一种方法的接口:
public interface M {
public void go();
}
M的每个实现实现M方法之一的逻辑:
public class M1 implements M {
public void go() {
//logic for m1
}
}
public class M2 implements M {
public void go() {
//logic for m2
}
}
等等
现在,类A引用了100 M对象,每个方法只需对其中一个对象调用go()。您可以分别实现和测试每种逻辑
public class A implement a {
M[] ms = {
new M1(),
new M2(),
new M3(),
... ,
new M100()};
private do(int index) {
ms[index].go();
}
public m1 {
do(0);
}
public m2 {
do(1);
}
public m3 {
do(2);
}
...
public m100 {
do(99);
}
}
你可以使用代理
MyInterface instance = Proxy.newProxyInstance(MyInterface.class.getClassLoader(), MyInterface.class, new InvocationHandler(){
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable{
if(!method.getName().equals("methodICareAbout")) {
throw new UnsupportedOperationException();
}
//Implement your method here
}
});
免责声明:我永远不会建议在我的一个项目上实际使用这样的解决方案,但它确实允许您实现一个方法,而无需处理所有其他方法
IMO有一个包含100个方法的接口,您只想实现其中一个,这是一个主要的代码气味,表明您可能应该重新考虑您的设计。但是,如果你束手无策,你别无选择,只能使用现有的界面,这个解决方案就行了。这正是MouseAdapter、WindowAdapter等为相应的MouseListener、WindowListener Swing界面所做的。@Renuka采访者想知道,如果您了解了不同的b/w接口和抽象类,以及如何将它们结合使用。@怀疑论者——仅仅因为他们在12-15年前就这样做了(Swing基本上继承了这种方法),并不意味着这是今天的良好设计实践。你也可以说,考虑到这两个野兽(UI事件的监听器)的本质,它们是证明规则的例外。