代码之家  ›  专栏  ›  技术社区  ›  elect

Java,超级超级类的隐藏方法

  •  1
  • elect  · 技术社区  · 10 年前

    我正在将一些OpenGL Nvidia C示例移植到jogl,我有以下内容( init 是所需的抽象方法之一 GLEventListener :

    public abstract class NvAppBase implements GLEventListener {
        @Override
        public void init(GLAutoDrawable drawable) {
            initRendering(gl4);
        }
        public void initRendering(GL4 gl4) {
        }
    }
    
    public abstract class NvSampleApp extends NvAppBase {
        @Override
        public void init(GLAutoDrawable drawable) {
            baseInitRendering(gl4);
        }
        protected void baseInitRendering(GL4 gl4) {
            initRendering(gl4);
        }
        @Override
        public void initRendering(GL4 gl4) {
        }
    }
    public class BindlessApp extends NvSampleApp{    
        @Override
        public void initRendering(GL4 gl4) {    
        }
    }
    

    鉴于:

    • NvAppBase 根本不使用,所有样本(例如 BindlessApp )始终延伸 NvSampleApp
    • 我想延长上课时间 NvSampleApp 只能看到(并覆盖) initRendering 而不是 初始化

    有比仅仅拥有更好的方法吗 NvSampleApp 简单地作为内部变量 无绑定应用程序 例如,像这样?

    public class BindlessApp {    
        private NvSampleApp sampleApp;
    }
    
    2 回复  |  直到 10 年前
        1
  •  3
  •   Ferrybig    10 年前

    您可以使用关键字 final 为此。

    Writing Final Classes and Methods 关于Oracle java教程。

    您可以将类的一些或所有方法声明为final。您使用 方法声明中的final关键字,用于指示方法 不能被子类覆盖。Object类执行此操作a 其方法的数量是最终的。

        2
  •  1
  •   Community Mohan Dere    9 年前

    有没有比简单地将NvSampleApp作为 BindlesApp中的变量,例如这样?

    虽然这看起来是更多的工作, 封装,封装 是一个很好的工具,可以帮助隔离部分代码,减少耦合。

    我认为在您的情况下,这可能是更好的解决方案:)

    有关此答案的详细信息,请参见: https://stackoverflow.com/a/18301036/461499