我想在Vala语言的泛型内部创建给定类型的新对象。
class MyClass <T> : GLib.Object
{
protected T data;
public MyClass ()
{
data = new T ();
}
}
我知道这是行不通的,但是这样做的方式是什么?
答案 0 :(得分:0)
调用MyClass
的构造函数时,最好将其实例化:
void main () {
new MyClass<Test> (new Test ());
new MyClass<Example> (new Example ());
}
class MyClass <T>
{
protected T data;
public MyClass (T data)
{
this.data = data;
}
}
class Test {}
class Example {}
Vala泛型目前不提供约束。如果您要通过这种方式传递依赖关系,则可能需要考虑使用接口类型而不是泛型类型。
如果要实现工厂,则最好使用带有静态方法或函数的接口:
void main () {
var a = CommandFactory.get_command ("A");
var b = CommandFactory.get_command ("B");
a.run ();
b.run ();
}
namespace CommandFactory {
Command get_command (string criteria) {
Command result = null;
switch (criteria) {
case "A":
result = new CommandA ();
break;
case "B":
result = new CommandB ();
break;
default:
assert_not_reached ();
}
return result;
}
}
interface Command:Object {
public abstract void run ();
}
class CommandA:Object, Command {
void run () { print ("A\n"); }
}
class CommandB:Object, Command {
void run () { print ("B\n"); }
}
我假设“抽象面料图案”是指“抽象工厂图案”?您可以尝试使用GType自省然后实例化该对象,但是它必须是GObject,并且要通过Vala的静态分析检查:
void main () {
new MyClass<Example> (new Example ());
/* These will fail at runtime
new MyClass<string> ("this will fail at runtime");
new MyClass<ThisWillFailAtRuntime> (new ThisWillFailAtRuntime ());
*/
}
class MyClass <T>
{
protected T data;
public MyClass (T data)
{
assert (typeof(T).is_object());
this.data = Object.new (typeof(T));
}
}
class Example:Object {}
class ThisWillFailAtRuntime {}
请注意,Object.new()
也是静态方法。
我不确定您要实现的目标,但是您最好是更仔细地研究接口,并在对象数据模型中偏向于继承而不是继承。