Dlang:如何处理各种类型的数组
Dlang: How to handle an array of various types
我正在学习 D 并且正在尝试处理泛型类型的方法。在 D 中,我如何声明一个数组来存储具有不同输入参数的委托?
在示例中,我试图部分模仿 JavaScript 使用 .addEventListener/.dispatchEvent 的方式,为此我需要存储一个侦听器数组,其中它们将具有各种事件类型作为输入参数.我试图防止来回进行大量类型转换,但我被困在需要将它们存储在同一个数组中的地步。
import std.stdio;
class Event {
}
class NewEvent : Event {
}
class EventTarget {
void addEventListener(T)(void delegate(T) listener) {
this.listeners ~ listener;
}
void dispatchEvent(T)(T event) {
foreach (listener; this.listeners) {
writeln("listener: ", listener, " ", event);
// TODO: call listener if it's input argument matches the T type
// if (type is the one matching the listeners first input argument) {
// listener(event);
// }
}
}
private:
// TODO: find a way to store multiple event types in this array
void delegate(T)[] listeners;
}
void main() {
auto target = new EventTarget();
target.addEventListener((NewEvent event) {
write("executed handler for NewEvent", event);
});
target.addEventListener((Event event) {
write("executed handler for Event", event);
});
target.dispatchEvent(new NewEvent());
target.dispatchEvent(new Event());
}
这个应该有效:
import std.stdio;
import std.traits;
abstract class Event {
}
class NewEvent : Event {
}
class NewEvent2 : Event {
}
class EventTarget {
void addEventListener(T : Event)(void delegate(T) listener) {
this.listeners ~= DG(listener);
}
void dispatchEvent(T : Event)(T event) {
foreach (listener; listeners)
{
if (listener.type_name == fullyQualifiedName!T)
{
listener(event);
}
}
}
private:
DG[] listeners;
}
struct DG
{
string type_name;
void delegate(Event) dg;
alias dg this;
this(T : Event)(void delegate(T) listener)
{
type_name = fullyQualifiedName!T;
dg = cast(void delegate(Event)) listener;
}
}
void main() {
auto target = new EventTarget();
target.addEventListener((NewEvent event) {
writeln("executed handler for NewEvent", event);
});
target.addEventListener((NewEvent2 event) {
writeln("executed handler for Event", event);
});
target.dispatchEvent(new NewEvent());
target.dispatchEvent(new NewEvent2());
}
我正在学习 D 并且正在尝试处理泛型类型的方法。在 D 中,我如何声明一个数组来存储具有不同输入参数的委托?
在示例中,我试图部分模仿 JavaScript 使用 .addEventListener/.dispatchEvent 的方式,为此我需要存储一个侦听器数组,其中它们将具有各种事件类型作为输入参数.我试图防止来回进行大量类型转换,但我被困在需要将它们存储在同一个数组中的地步。
import std.stdio;
class Event {
}
class NewEvent : Event {
}
class EventTarget {
void addEventListener(T)(void delegate(T) listener) {
this.listeners ~ listener;
}
void dispatchEvent(T)(T event) {
foreach (listener; this.listeners) {
writeln("listener: ", listener, " ", event);
// TODO: call listener if it's input argument matches the T type
// if (type is the one matching the listeners first input argument) {
// listener(event);
// }
}
}
private:
// TODO: find a way to store multiple event types in this array
void delegate(T)[] listeners;
}
void main() {
auto target = new EventTarget();
target.addEventListener((NewEvent event) {
write("executed handler for NewEvent", event);
});
target.addEventListener((Event event) {
write("executed handler for Event", event);
});
target.dispatchEvent(new NewEvent());
target.dispatchEvent(new Event());
}
这个应该有效:
import std.stdio;
import std.traits;
abstract class Event {
}
class NewEvent : Event {
}
class NewEvent2 : Event {
}
class EventTarget {
void addEventListener(T : Event)(void delegate(T) listener) {
this.listeners ~= DG(listener);
}
void dispatchEvent(T : Event)(T event) {
foreach (listener; listeners)
{
if (listener.type_name == fullyQualifiedName!T)
{
listener(event);
}
}
}
private:
DG[] listeners;
}
struct DG
{
string type_name;
void delegate(Event) dg;
alias dg this;
this(T : Event)(void delegate(T) listener)
{
type_name = fullyQualifiedName!T;
dg = cast(void delegate(Event)) listener;
}
}
void main() {
auto target = new EventTarget();
target.addEventListener((NewEvent event) {
writeln("executed handler for NewEvent", event);
});
target.addEventListener((NewEvent2 event) {
writeln("executed handler for Event", event);
});
target.dispatchEvent(new NewEvent());
target.dispatchEvent(new NewEvent2());
}