我有一个名为my_class的类。在my_class中有一个名为my_port的类。 my_port参数化其中一个参数是my_class。问题是,它们位于不同的文件中,默认参数是my_class。我有一个my_class_pkg和my_port_pkg包。如果我将my_port_pkg导入my_class_pkg,我仍然无法编译,因为my_port_pkg仍然需要能够看到my_class,因为它也在使用该信息。这种交叉引用通常如何解决?
class my_port#(type T = my_class) extends base_class #(T);
//code here
endclass
和
class my_class
my_port#(something) X;
//code here
endclass
和
package my_class_pkg
import my_port_pkg::*;
`include "my_class.sv";
endpackage
和
package my_port_pkg
`include "my_port.sv";
endpackage
答案 0 :(得分:2)
这种鸡蛋问题在OO设计中很常见。如果所有内容都在同一个包中,那么转发类型定义就可以解决问题:
package my_package;
typedef class my_class; // this is a forward type definition
class my_other_class;
my_class mc;
endclass
class my_class;
my_other_class moc;
endclass
endpackage
module my_module;
import my_package::*;
my_class mc = new;
endmodule
https://www.edaplayground.com/x/3sbd
将这些类放在不同的包中,事情会有点棘手。这似乎有效,但有点讨厌:
<强> my_class.sv:强>
class my_class;
my_port #(base_class) X;
//code here
endclass
<强> my_port.sv:强>
typedef class my_class;
class base_class #(type T = my_class);
//code here
endclass
class my_port#(type T = my_class) extends base_class #(T);
//code here
endclass
包:
package my_port_pkg;
`include "my_port.sv";
`include "my_class.sv";
endpackage
package my_class_pkg;
import my_port_pkg::*;
`include "my_class.sv";
endpackage
答案 1 :(得分:1)
我怀疑你没有显示更多,因为你的实际代码更复杂。建议替代方案很难。
主要问题是为什么这些紧密连接的类在两个独立的包中?如果它们位于同一个包中,则可以使用可解决此循环依赖关系的转发type T = my_class
。
另一种方法是通过删除默认type T
来破坏循环依赖关系,并使用 gridview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
final Intent intent;
switch(position)
{
case 0:
intent = new Intent(context, FirstActivity.class);
break;
case 1:
intent = new Intent(context, SecondActivity.class);
break;
...
default:
intent = new Intent(context, DefaultActivity.class);
break;
}
startActivity(intent);
}
});
。