【发布时间】:2019-01-29 18:49:32
【问题描述】:
我有一个模型类,有一个名为 square 的子类。在模型类中,我有一个 draw 方法,它需要子类中的一些字段。我有一个子类的实例,并想调用它的绘制函数(在子类中不会被覆盖)。
我正在尝试在 Android 上使用 openGL 制作一些东西,并且有很多模型使用基本相同的代码进行绘制,但使用不同的网格,因此具有不同的字段。我认为将绘制函数复制到每个模型类有点多余,当我尝试在模型类上简单地添加空字段并在子类上添加同名字段时,它在调用时使用超类中的字段使用子类实例的方法,此外,将字段作为参数传递不是一种选择,因为超级构造函数调用必须是子类构造函数中的第一个调用,我需要对子类中的字段应用一些操作' 构造函数(我想,正如你所说,我对 OOP 没有经验)。
以下很多内容都是暂时的,因为我仍在努力掌握事情的窍门
精简模型超类:
abstract public class Model {
static final int COORDS_PER_VERTEX = 3;
final float Coords[];
public Model(){
//do some stuff unrelated to the issue
}
public void draw(){
final int vertexCount = Coords.length / COORDS_PER_VERTEX;
}
}
精简模型子类:
public class Square extends Model{
private static float Coords[] = {
-0.5f, 0.5f, 0.0f, // top left
-0.5f, -0.5f, 0.0f, // bottom left
0.5f, -0.5f, 0.0f, // bottom right
0.5f, 0.5f, 0.0f }; // top right
public Square() {
super();
//do something to Coords
}
}
方法调用:
private ArrayList<Model> models = new ArrayList<>();
models.add(new Square());
for (Model model:models) {
model.draw();
}
我希望 draw 函数将 12/3=4 用于 vertexCount,但它会引发 NullPointer 错误,因为您不能在空数组上使用 .length。
【问题讨论】:
-
但是
draw在不同的形状上会有所不同,对吧?这不是多余的。也可以在构造函数之外使用super()。 -
它不会对不同的形状做不同的事情 - 它总是绘制网格中的每个三角形。
-
它们有什么不同吗? Vertex Buffer Object在显卡上存储顶点,会比每次上传到GPU都要快。
-
我实际上确实使用了顶点缓冲区,这是我试图传递的字段之一。就像我在帖子中提到的那样,我发布的代码被精简到最低限度以重新创建问题,正如堆栈溢出所建议的那样。