说我们有以下设置:
open class Foo(open val img: Image) {
val use = img.graphics
}
class Bar(override val img: BufferedImage) : Foo(img)
初始化时,使用img.width
会创建NPE。我认为问题是,显然即使img
直接在Bar中传递给Foo的构造函数,当它在Foo中使用时它并不指向它,而是指向被覆盖的变量酒吧班。我怎么能避免这个?
答案 0 :(得分:1)
此行为是由于CREATE TABLE tenant (
id INT NOT NULL,
nome VARCHAR(255) NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE customer (
id INT NOT NULL,
id_tenant INT NOT NULL,
nome VARCHAR(255) NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (id_tenant) REFERENCES tenant(id),
-- pra ter a FK composta, tem que ter chave composta na tabela de origem
UNIQUE (Id,id_tenant)
);
CREATE TABLE [order] (
id INT NOT NULL,
id_customer INT NOT NULL,
id_tenant INT NOT NULL,
nome VARCHAR(255) NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (id_customer, id_tenant) REFERENCES customer (id, id_tenant),
FOREIGN KEY (id_tenant) REFERENCES tenant(id)
);
的getter被覆盖并返回不同字段的值(因为img
覆盖Bar
不同类型的事实所致,这需要创建另一个img
类型的字段。在BufferedImage
中分配该字段之前执行Foo
构造函数。
通常,您应该避免在类的初始化逻辑中使用open成员,因为它们可能在子类中被覆盖,并且可能依赖于某些状态,这些状态在超类初始化时尚未正确初始化。
对于您的特定情况,请在Bar
构造函数中为img
设置一个简单参数并明确使用该参数:
Foo