Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何阻止来自子对象的调用重写方法_Java_Events_Block_Extends - Fatal编程技术网

Java 如何阻止来自子对象的调用重写方法

Java 如何阻止来自子对象的调用重写方法,java,events,block,extends,Java,Events,Block,Extends,例如,我有两门课 public class PActivity { ... @Override public boolean OnEventSocket(PMSocketEvent a_iEvent) ... handled = OnEventSocket(...); } } 二等舱: public class PMenu extends PActivity { @Override public boolean OnEve

例如,我有两门课

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

中进行更改,我将使用一种

从本质上讲,您不是拥有一个可重写的公共方法,而是重写一个由该公共方法调用的受保护方法。这允许您在调用重写的方法之前执行任何需要执行的检查

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
实现的情况下实现此功能,但有两个缺点:

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

你可以在子类的方法中通过
super.OnEventSocket(..)
来实现。你说的“阻止调用方法”是什么意思?你想使用子类的实例从超类调用
OnEventSocket
吗?例如,我的android活动在PMenu中,但我不想从PMenu调用方法,但是从PActivity.And call方法只在PActivity类中,但我想有30个类,比如PMenu,所以我必须将名称OnEventSocket更改为eventSocketImpl everywhere?我想避免这种情况situation@asus9e这就是我最后两个要点的意思。您可以保持现在的状态,但这意味着您的“入口点”方法(my
public
one)需要更改名称。根据调用此函数的代码中的位置,这可能比更改所有
PMenu
s的工作量要大或小。好的,我理解:)谢谢:)此函数在PActivity中只调用一次