为什么父 class 无法访问子 class 成员
Why parent class is not able to access child class member
如果我们按照下面的代码
class A;
int a = 10;
endclass
class B extends A;
int b = 20;
endclass
program test;
A a1;
B b1;
initial begin
b1 = new();
a1 = b1; //child class object is assigned to parent class handle
$display("Value of variable b is %x", a1.b);
end
endprogram
然后上面的代码导致错误 "Could not find member 'b' in class 'A'"
现在我的观察是,当扩展 class 对象被分配给基础 class 句柄时,模拟器将检查句柄的类型并检查 class 中是否存在变量。由于变量 b 未在基 class 中定义,因此将导致错误。
所以我想确认一下我上面的观察是正确的还是不正确的?
如果有人想对我的观察添加一些内容,我将非常欢迎,以防它是正确的。
谢谢
你是对的,这是我所知道的 OOP 语言的预期行为(我不是特别了解你正在使用的语言,但你的例子很简单)。能够使用子 class 声明的变量将导致违反 polymorphism(或子类型)的面向对象原则。
我会在 Java 中回答你,因为我确定我想给出的例子在这种语言中的语法。想象一下具有相同声明类型的两个变量:
public A buildA () {
return new B();
}
public static void main () {
A a1 = new A();
A b1 = buildA();
}
多态性原则是a1
和b1
实现相同的接口,区别使用。如果我被允许访问一个变量的成员 b
,因为编译器无法猜测哪个是 base 哪个是 child,那么每次我访问一个具体的 [=14= 时,它都会允许程序在运行时崩溃], 删除应该提供的安全网类型。
我不会在这里使用术语 parent 和 child class。这意味着您有两个单独的 class 对象 。
您描述的是两种不同的 class 类型 ,其中一种类型是 derived/extended 来自基本类型。然后声明两个 class 变量 :a1
和 b1
。这些变量可能包含 handle 到 class 相同类型的对象,或扩展变量类型的任何类型对象的句柄。但是,无论 class 变量当前持有句柄的对象类型如何,编译器都不允许您引用任何未由 class 变量的类型定义的变量或成员。
OOP 使您能够与 class 变量交互,并有可能在您不知道对该对象进行了哪些扩展的情况下处理更复杂的对象。但是您必须假设该对象可能与 class 变量的类型相同。编译器也强制执行此操作。如果要与扩展的class 变量进行交互,则需要使用扩展的class 变量类型。
如果我们按照下面的代码
class A;
int a = 10;
endclass
class B extends A;
int b = 20;
endclass
program test;
A a1;
B b1;
initial begin
b1 = new();
a1 = b1; //child class object is assigned to parent class handle
$display("Value of variable b is %x", a1.b);
end
endprogram
然后上面的代码导致错误 "Could not find member 'b' in class 'A'"
现在我的观察是,当扩展 class 对象被分配给基础 class 句柄时,模拟器将检查句柄的类型并检查 class 中是否存在变量。由于变量 b 未在基 class 中定义,因此将导致错误。
所以我想确认一下我上面的观察是正确的还是不正确的?
如果有人想对我的观察添加一些内容,我将非常欢迎,以防它是正确的。
谢谢
你是对的,这是我所知道的 OOP 语言的预期行为(我不是特别了解你正在使用的语言,但你的例子很简单)。能够使用子 class 声明的变量将导致违反 polymorphism(或子类型)的面向对象原则。
我会在 Java 中回答你,因为我确定我想给出的例子在这种语言中的语法。想象一下具有相同声明类型的两个变量:
public A buildA () {
return new B();
}
public static void main () {
A a1 = new A();
A b1 = buildA();
}
多态性原则是a1
和b1
实现相同的接口,区别使用。如果我被允许访问一个变量的成员 b
,因为编译器无法猜测哪个是 base 哪个是 child,那么每次我访问一个具体的 [=14= 时,它都会允许程序在运行时崩溃], 删除应该提供的安全网类型。
我不会在这里使用术语 parent 和 child class。这意味着您有两个单独的 class 对象 。
您描述的是两种不同的 class 类型 ,其中一种类型是 derived/extended 来自基本类型。然后声明两个 class 变量 :a1
和 b1
。这些变量可能包含 handle 到 class 相同类型的对象,或扩展变量类型的任何类型对象的句柄。但是,无论 class 变量当前持有句柄的对象类型如何,编译器都不允许您引用任何未由 class 变量的类型定义的变量或成员。
OOP 使您能够与 class 变量交互,并有可能在您不知道对该对象进行了哪些扩展的情况下处理更复杂的对象。但是您必须假设该对象可能与 class 变量的类型相同。编译器也强制执行此操作。如果要与扩展的class 变量进行交互,则需要使用扩展的class 变量类型。