我正在将一些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
而不是init
有没有更好的方法,只需将NvSampleApp
简单地作为BindlessApp
内的变量,例如这样?
public class BindlessApp {
private NvSampleApp sampleApp;
}
答案 0 :(得分:3)
您可以将关键字final
用于此目的。
Writing Final Classes and Methods。
你可以声明一些或所有类的方法final。你用的是 方法声明中的final关键字表示该方法 不能被子类覆盖。 Object类执行此操作-a 其方法的数量是最终的。
答案 1 :(得分:1)
有没有比仅仅使用NvSampleApp更好的方法了 BindlessApp中的变量,例如这个?
虽然看起来更有效,但封装是一个很好的工具,可以帮助隔离部分代码,减少耦合。
我认为在你的情况下它甚至可能是更好的解决方案:)
有关详细信息,请参阅此答案:https://stackoverflow.com/a/18301036/461499