我想在Vala语言的泛型中创建一个给定类型的新对象。
class MyClass <T> : GLib.Object
{
protected T data;
public MyClass ()
{
data = new T ();
}
}我知道这是行不通的,但是怎样才能做到这样呢?
发布于 2019-01-30 19:49:52
最好是在调用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()也是一个静态方法。
我不确定您想要实现什么,但您最好更仔细地研究一下接口,并且在对象数据模型中更倾向于组合而不是继承。
https://stackoverflow.com/questions/54438841
复制相似问题