【问题标题】:How to restrict child classes from modifying the scope of a method in Abstract class?如何限制子类修改抽象类中方法的范围?
【发布时间】:2012-07-05 11:52:37
【问题描述】:

如何限制我的抽象类的实现类将方法的范围从受保护的修改为公共的?

例如:假设我有一个抽象类

package com.rao.test;

public abstract  class AbstractTEClass {

    protected abstract void function1();

    protected abstract void function2();


    protected void doWork() //I want to call the abstract methods from this method.
    {
        function1(); //implementation classes will give implementation of these methods
        function2();

    }

}

现在,我有一个扩展上述抽象类的实现类

package com.rao.test;

public class AbstractTEClassImpl extends AbstractTEClass {

    @Override
    public void function1() {
        // TODO Auto-generated method stub
        System.out.println("FUnction1");
    }

    @Override
    public void function2() {
        // TODO Auto-generated method stub
        System.out.println("Function2");
    }


    public static void main(String[] args)
    {
        AbstractTEClassImpl objTEClass = new AbstractTEClassImpl();

        objTEClass.doWork();

    }

}

请注意,我正在将实现类中的 2 个抽象方法的范围从受保护更改为公共,如何限制我的实现类修改范围。
欢迎任何设计更改或建议或模式。

【问题讨论】:

  • 为什么要设置这个限制?也许你走错路了……

标签: java oop inheritance scope


【解决方案1】:

你不能。

一个覆盖类总是可以比它覆盖的方法更多地访问一个方法。

在此处阅读有关修饰符的部分http://docs.oracle.com/javase/tutorial/java/IandI/override.html

覆盖方法的访问说明符可以允许比被覆盖方法更多但不能更少的访问。例如,超类中的受保护实例方法可以在子类中公开,但不能设为私有。

如果您尝试将超类中的实例方法更改为子类中的类方法,则会收到编译时错误,反之亦然。

【讨论】:

    【解决方案2】:

    没有办法做到这一点。而且我也不明白这一点:如果子类想让这个方法可以访问,为什么不呢?无论如何它不会影响父抽象类的用户。

    【讨论】:

    • 即使你可以限制它,子类也可以创建另一个调用受保护方法的公共方法,无论如何都会暴露行为。
    • 我正要编辑我的答案以说出完全相同的内容。不再需要了:-)
    • 我知道这不能直接完成。有没有使用设计模式的解决方法可以实现这一点???
    • 您正在使用模板模式。您可以改用策略模式:使父类非抽象和最终,并使其采用策略参数作为实现函数1和函数2的参数。我不知道它是否符合您的要求,因为我不知道您想要实现什么。
    • 也就是说,我很确定没有办法真正接近这种愿望。
    【解决方案3】:

    你不能。我怀疑你想要做的是摆弄doWork(),这样它就可以在函数1和2覆盖内可能发生的任何滥用扩展类中幸存下来。您可能想要添加方法和/或更改这些方法的作用。

    覆盖是一件很方便的事情。我经常对在 C# 中工作感到非常恼火,因为微软“密封”了一切以防止覆盖。 (我夸大了;他们只密封想要覆盖的方法。)不要走那条路。找出你真正的问题是什么并在你的基础 AbstractTEClass 类中处理它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      • 1970-01-01
      • 1970-01-01
      • 2013-11-30
      • 1970-01-01
      • 2013-08-02
      • 1970-01-01
      相关资源
      最近更新 更多