抽象クラスとバーチャルメソッド

抽象クラスは、このクラスの実体(インスタンス)を直接生成することができません。

抽象クラスの定義は、通常のクラスと同様に定義しますが、class の前に virtual を付ける必要があります。

virtual class VClass;

抽象クラスは、メソッドを持つことができますが、classと同じように virtual を付ける必要があります。

これをバーチャルメソッド(関数/タスク)と呼びます。

virtual class VClass;

virtual function integer func_a( integer x, integer y );

endfunction : func_a

virtual task task_b( bit [31:0] x );

endtask : task_b

endclass : VClass

バーチャルメソッドの中は空です。抽象クラスを継承する子クラスでメソッドを再定義します。

class RClass extends VClass;

function integer func_a( integer x, integer y );

// ここでなにかを行う

endfunction : func_a

task task_b( bit [31:0] x );

// ここでなにかを行う

endtask : task_b

endclass : RClass

抽象クラスで定義したバーチャルメソッドは、継承したクラスでかならず再定義しなければいけません。

もし、継承したクラスでもメソッドを定義していないのなら、その継承したクラスも抽象クラスにしなければいいけません。

また、バーチャルメソッドは、メソッドのプロトタイプだけ(つまり、何もしない本体無しに)にすることもできます。

virtual class VClass;

virtual function integer func_a( integer x, integer y );

virtual task task_b( bit [31:0] x );

endclass : VClass