一旦被覆盖,如何使用 base class 对象访问 base class 方法?
How can one access a base class method using base class object once it has been overwritten?
这个问题可能适用于 all/most 面向对象的编程语言,但我只关心 SystemVerilog 方面。
多态性,我以为我明白了,直到前几天我和一位同事交谈,这来了,我意识到我不知道如何做到这一点。
以下是为了本次讨论的目的需要考虑的两个 classes -
class four_wheeler;
virtual function void vehicle_type();
$display("Four-wheeler");
endfunction:vehicle_type
virtual task colour();
$display("Many colours");
endtask:colour
endclass:four_wheeler
class jaguar extends four_wheeler;
function void vehicle_type();
$display("Jaguar");
endfunction:vehicle_type
task colour();
$display("Black");
endtask:colour
endclass:jaguar
program sv_prog;
initial begin
four_wheeler four_wheeler_h;
jaguar jaguar_h;
four_wheeler_h = new();
jaguar_h = new();
four_wheeler_h = jaguar_h;
four_wheeler_h.vehicle_type();
end
endprogram: sv_prog
我想使用它自己的对象访问基 class four_wheeler 中的 vehicle_type()
函数。我可以在 four_wheeler_h = jaguar_h
副本之前通过 four_wheeler_h.vehicle_type()
来完成此操作。正常的 OOP 工作!但是我可以在句柄复制之后做吗?
我可以在 jaguar class vehicle_type()
方法中使用 super
关键字:
function void vehicle_type();
super.vehicle_type();
$display("Jaguar");
endfunction:vehicle_type
并得到输出:
Four-wheeler
Jaguar
但我更感兴趣的是从程序块本身执行此操作,而不必修改 jaguar class 中的函数。有什么办法可以实现吗?也许从程序块本身使用 super
。
恐怕与 c++ 不同,您的实现方式非常有限(例如 java)。所以,所有的语言都是不同的。
类似于java,SystemVerilog 为您提供关键字'super',您可以在class 成员中使用它。您将必须创建一个特定的 class 成员函数来访问其在非 class 范围内的 base(super)-class 成员:
class jaguar extends four_wheeler;
...
function super_vehicle_type();
super.vehicle_type();
endfunction
endclass:jaguar
现在您可以使用
jaguar_h.super_vehicle_type();
您还可以在函数中使用 class 作用域标识符来访问任何基础 classes。
function super_vehicle_type();
four_wheeler::vehicle_type();
endfunction
在上述情况下,您可以使用任何基础 classes(而不是 four_wheeler)作为 class 范围。
简单的答案是否,虚拟方法不是这样工作的。多态性以这样的方式定义它,你不应该知道你正在处理一个被覆盖的 class 对象。这就像询问您是否已将成员声明为 local
或 protected
,是否有任何方法可以从 class 外部访问该成员。答案也是 no。 但是...如果您在基 class 中提供额外的访问器方法,则可以通过多种方式控制对这些成员变量和方法的访问。
class base;
local int base_variable;
virtual function void do_this;
endfunction
function int get_base_variable;
return base_variable;
endfunction
function void base_to_this;
base::do_this();
endfunction
endless
这个问题可能适用于 all/most 面向对象的编程语言,但我只关心 SystemVerilog 方面。 多态性,我以为我明白了,直到前几天我和一位同事交谈,这来了,我意识到我不知道如何做到这一点。 以下是为了本次讨论的目的需要考虑的两个 classes -
class four_wheeler;
virtual function void vehicle_type();
$display("Four-wheeler");
endfunction:vehicle_type
virtual task colour();
$display("Many colours");
endtask:colour
endclass:four_wheeler
class jaguar extends four_wheeler;
function void vehicle_type();
$display("Jaguar");
endfunction:vehicle_type
task colour();
$display("Black");
endtask:colour
endclass:jaguar
program sv_prog;
initial begin
four_wheeler four_wheeler_h;
jaguar jaguar_h;
four_wheeler_h = new();
jaguar_h = new();
four_wheeler_h = jaguar_h;
four_wheeler_h.vehicle_type();
end
endprogram: sv_prog
我想使用它自己的对象访问基 class four_wheeler 中的 vehicle_type()
函数。我可以在 four_wheeler_h = jaguar_h
副本之前通过 four_wheeler_h.vehicle_type()
来完成此操作。正常的 OOP 工作!但是我可以在句柄复制之后做吗?
我可以在 jaguar class vehicle_type()
方法中使用 super
关键字:
function void vehicle_type();
super.vehicle_type();
$display("Jaguar");
endfunction:vehicle_type
并得到输出:
Four-wheeler
Jaguar
但我更感兴趣的是从程序块本身执行此操作,而不必修改 jaguar class 中的函数。有什么办法可以实现吗?也许从程序块本身使用 super
。
恐怕与 c++ 不同,您的实现方式非常有限(例如 java)。所以,所有的语言都是不同的。
类似于java,SystemVerilog 为您提供关键字'super',您可以在class 成员中使用它。您将必须创建一个特定的 class 成员函数来访问其在非 class 范围内的 base(super)-class 成员:
class jaguar extends four_wheeler;
...
function super_vehicle_type();
super.vehicle_type();
endfunction
endclass:jaguar
现在您可以使用
jaguar_h.super_vehicle_type();
您还可以在函数中使用 class 作用域标识符来访问任何基础 classes。
function super_vehicle_type();
four_wheeler::vehicle_type();
endfunction
在上述情况下,您可以使用任何基础 classes(而不是 four_wheeler)作为 class 范围。
简单的答案是否,虚拟方法不是这样工作的。多态性以这样的方式定义它,你不应该知道你正在处理一个被覆盖的 class 对象。这就像询问您是否已将成员声明为 local
或 protected
,是否有任何方法可以从 class 外部访问该成员。答案也是 no。 但是...如果您在基 class 中提供额外的访问器方法,则可以通过多种方式控制对这些成员变量和方法的访问。
class base;
local int base_variable;
virtual function void do_this;
endfunction
function int get_base_variable;
return base_variable;
endfunction
function void base_to_this;
base::do_this();
endfunction
endless