Vala泛型中对象的实例化
Instantiation of object in Vala generic
我想在 Vala 语言的泛型中创建一个给定类型的新对象。
class MyClass <T> : GLib.Object
{
protected T data;
public MyClass ()
{
data = new T ();
}
}
我知道这是行不通的,但是有什么方法可以做到这一点?
您最好在为 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"); }
}
我假设 'abstract fabric pattern' 你的意思是 'abstract factory pattern'?您可以尝试使用 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()
也是一个静态方法。
我不确定您要实现的目标是什么,但您最好更仔细地研究接口,并在您的对象数据模型中支持组合而不是继承。
我想在 Vala 语言的泛型中创建一个给定类型的新对象。
class MyClass <T> : GLib.Object
{
protected T data;
public MyClass ()
{
data = new T ();
}
}
我知道这是行不通的,但是有什么方法可以做到这一点?
您最好在为 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"); }
}
我假设 'abstract fabric pattern' 你的意思是 'abstract factory pattern'?您可以尝试使用 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()
也是一个静态方法。
我不确定您要实现的目标是什么,但您最好更仔细地研究接口,并在您的对象数据模型中支持组合而不是继承。