假设我有一个包公开了一个mixin
,它通过API提供了一些可扩展性:
mixin ListenerModifier<T> {
T get value;
void addListener(Callback callback);
void removeListener(Callback callback);
}
假设我想基于这个mixin创建一个"插件":
mixin PreviousValue<T> on ListenerModifier<T> {
late T previous;
const PreviousValue() {
addListener(() => previous = value);
}
}
(You也可以在其他包中定义插件,可能是为了公开Stream<T>
getter。)
然后,用户可以随意使用任何插件,如下所示:
abstract class MyListener<T> with ListenerModifier<T>, PreviousValue<T> {}
问题是,mixin不能有像上面PreviousValue
假设的构造函数。有一些OOP/体系结构的方法来解决这个问题吗?我最初想到的解决方法是强迫PreviousValue
的用户(例如)在他们的MyListener
构造函数中调用registerPreviousValue()
方法,但这很容易出错。
相关:
1条答案
按热度按时间rfbsl7qr1#
我刚刚意识到,对于我给出的特定示例,我可以使用一种不同类型的插件系统,而无需mixin:
不过,这可能不适用于所有人。如果有人有不同的解决办法,我洗耳恭听。