【问题标题】:How to block call overridden method from Child如何阻止来自 Child 的调用覆盖方法
【发布时间】:2017-04-04 13:50:00
【问题描述】:

例如我有两个班级。

public class PActivity {
...
    @Override
    public boolean OnEventSocket(PMSocketEvent a_iEvent)
        ...
        handled = OnEventSocket(...);
    }
}

二等:

public class PMenu extends PActivity {
    @Override
    public boolean OnEventSocket(PMSocketEvent a_iEvent)
    {
        ...
    }
}

如何阻止第二类的调用方法?

有时我想从基类调用方法OnEventSocket

我有很多像PMenu 这样的课程,所以我必须在PActivity 中进行更改

【问题讨论】:

  • 您可以在子类的方法中通过super.OnEventSocket(....) 这样做。
  • “阻塞调用方法”是什么意思?
  • 你想使用子类的实例从超类调用OnEventSocket吗?
  • 例如我的android活动在PMenu中,但我不想从PMenu调用方法,而是从PActivity。
  • 而且调用方法只在PActivity类中

标签: java events block extends


【解决方案1】:

我会使用一种template method pattern

本质上,不是拥有一个可覆盖的公共方法,而是覆盖一个由公共方法调用的受保护方法。这使您可以在调用被覆盖的方法之前进行所需的任何检查。

public class PActivity {
...
    public final boolean onEventSocket(args)
    {
        if (method_should_be_called)
        {
            eventSocketImpl(args);
        }
    }

    protected boolean eventSocketImpl(args)
    {
        // default behaviour
    }
}

public class PMenu extends PActivity {
    @Override
    protected boolean eventSocketImpl(args)
    {
        // overridden behaviour
    }
}

您应该能够在不更改任何 PMenu 实现的情况下完成这项工作,但有两个缺点:

  • 您将拥有一个应该受到保护的公共方法
  • 您必须保持当前方法名称不变,这可能会造成混淆。

【讨论】:

  • 但是我认为像 PMenu 这样的类有 30 个,所以我必须在任何地方将名称 OnEventSocket 更改为 eventSocketImpl?
  • 我想避免这种情况
  • @asus9e 这就是我最后两个要点的意思。您可以保持它现在的样子,但这意味着您的“入口点”方法(我的public 之一)需要更改名称。根据代码中调用的位置的多少,这可能比更改所有PMenus 更多或更少的工作。
  • 好的,我明白了 :) 谢谢 :) 这个函数我只在 PActivity 中调用过一次
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
相关资源
最近更新 更多