首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止客户端访问基类公共函数

如何防止客户端访问基类公共函数
EN

Stack Overflow用户
提问于 2013-01-20 13:07:43
回答 5查看 312关注 0票数 1
代码语言:javascript
复制
//cls_a is defined by system framework, so we cannot change its definition
public class cls_a {
  public void method_a();
}

//I add a new cls_b implemenation and would like to 
//add a new method_a(int) function
//and prevent client side to access cls_a.method_a()
public class cls_b extends cls_a {
  public void method_a(int a) {
    //do something for a
    method_a();
  }
}

//client side
cls_b b = new cls_b();
b.method_a(2); //it's okay
b.method_a(); //should give something error when compiling code

我想设计cls_b,这样当客户端调用b.method_a()时,Java编译器会给出一个错误。有人知道用Java怎么做吗?

EN

回答 5

Stack Overflow用户

发布于 2013-01-20 13:11:15

你不能这样做,因为你不能降低继承方法的可见性(例如,如果它是公共的,你就不能把它变成私有的)。

Why can't you reduce the visibility of a method in a Java subclass?解释了为什么会这样。

票数 2
EN

Stack Overflow用户

发布于 2013-01-20 13:12:23

一旦您将其公开,那么它的范围就可以在整个项目中使用。无法使公共函数对特定类隐藏

更新:我刚刚又读了一遍你的问题。我认为您希望其他开发人员在从b调用method_a()时会得到异常。如果这是您想要的,那么您可以尝试

代码语言:javascript
复制
package com.test;


public class ClassA {
    public static void main (String args[]) {
        ClassB b = new ClassB();
        b.print();
    }
}

class ClassC {
    public void print() {
        System.out.println("printA");
    }
}

class ClassB extends ClassC {

    public void print() {
        try {
            throw new Exception("This method is dead");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public void print(int i) {
        System.out.println(i);
    }
}
票数 2
EN

Stack Overflow用户

发布于 2013-01-20 13:17:12

您可以这样做:为客户端公开一个包装类。

代码语言:javascript
复制
 public class cls_a_Wrapper {
      private cls_a a;

      cls_a_Wrapper(){
          a = new cls_a();
      }  

      //methods
      public void method_a_wrapper(){
           a.method_a();
      }
  }

 public class cls_b extends cls_a_Wrapper {
      public void method_a_wrapper(int a) {

           //delegate to wrapper class method if its allowed
           method_a_wrapper();
     }
  }

因此,现在您的客户端应该使用cls_a_Wrapper类,而不是cls_a

所以现在你可以控制是否要调用基类的公共方法。这是适配器设计模式

如果不想调用公共方法,则为 :

class.

  • OR
  • 不在包装器中提供方法更改包装器类中方法的可见性

记住:对于客户端,原始类不存在。客户端应将包装器类视为基类。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14421848

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档