【问题标题】:Add another method to every implementation of my Interface in all implementations在所有实现中为我的接口的每个实现添加另一个方法
【发布时间】:2016-09-01 04:05:46
【问题描述】:

我有一个界面:

public interface InterfaceListener {
    void eventEnd();
}

有些方法接收这个InterfaceListener 作为参数,当然每个方法都以自己的方式实现它。例如:

myObject.callMethod(false,InterfaceListener() {
    @Override
    public void eventEnd() {
        //do some extra code
    }
});

现在我想添加一些更改,以确保 eventEnd() 中的每个实现只有在传递另一个方法后才会被调用 - callMyExtraMethod() 对所有调用都是通用的,类似这样:

myObject.callMethod(false,InterfaceListener() {
    @Override
    public void eventEnd() {
        if (callMyExtraMethod()) {
            //do some extra code
        }
    }
});

任何想法如何在不传递每个实现并手动向所有人添加相同检查的情况下将其添加到逻辑中?

【问题讨论】:

    标签: java oop inheritance interface


    【解决方案1】:

    在 IDE 中将 eventEnd 重命名为 eventEndImpl。然后添加默认方法:

    public interface InterfaceListener {
        default void eventEnd() {
            if (callMyExtraMethod()) {
                eventEndImpl();
            }
        }
    
        void eventEndImpl();
        // Uncomment, if this method must belong to the same class. 
        // bool callMyExtraMethod();
    }
    

    【讨论】:

    • 是的,你需要 Java 8。
    【解决方案2】:

    如果您使用的是 Java 7,实现此目的的一种方法 -

    使用抽象方法
    eventEndcallMyExtraMethod 以及模板方法 templateMethod 创建一个 AbstractListener

    public abstract class AbstractListener {
    
       public abstract void eventEnd();
       public abstract boolean callMyExtraMethod();
    
       public void templateMethod(){
        if(callMyExtraMethod()){
            eventEnd();
        }
      }
    }
    

    现在您可以创建匿名类并调用templateMethod()。这将确保在调用 eventEnd() 之前检查 callMyExtraMethod()

    AbstractListener listener = new AbstractListener() {
    
            @Override
            public void eventEnd() {
                // your implementation
            }
    
            @Override
            public boolean callMyExtraMethod() {
                //System.out.println("I am callMyExtraMethod");
                return true;
            }
        };
    
        listener.templateMethod();
    

    希望这会有所帮助。

    【讨论】:

    • 谢谢您的回答,我如何将其与接收接口类型的方法集成,是否需要每次通过后都运行它?
    • @RonTr 有两种方法可以与接收接口类型的方法集成。 (1) 使用AbstractListener implements InterfaceListener。并将template method 添加到InterfaceListener。这样,您现在可以将具体的 AbstractListener 类型传递给您的方法 (2) 或者使用您的 Java IDE,进行查找和替换,然后将 InterfaceListener 替换为 AbstractListener,如果您的程序设计允许的话。
    • @RonTr 该解决方案有用吗?如果您使用了其他解决方案,请同时发布。
    猜你喜欢
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多