如何在Dart中实现类似C++纯虚接口多继承的复合接口?
在Dart中实现类似C++的复合接口
你在C++中通过多重虚继承实现了将多个纯虚接口整合为get_if、put_if这类复合接口的逻辑,最终由fifo类实现所有接口并支持多类型引用。在Dart中,我们可以通过抽象接口多继承直接复刻该逻辑,mixin并非必需,但也可用于带默认实现的场景,下面分别说明:
一、抽象接口实现(最贴合C++逻辑)
Dart的抽象类(或interface关键字声明的接口)支持多继承,完全可以实现复合接口的需求:
1. 定义基础抽象接口
// 异步获取接口 abstract class AsyncGetIf { void get(int data); } // 同步获取接口 abstract class SyncGetIf { bool empty(); bool tryGet(int data); } // 异步写入接口 abstract class AsyncPutIf { void put(int data); } // 同步写入接口 abstract class SyncPutIf { bool full(); bool tryPut(int data); }
2. 定义复合接口
直接让复合接口继承多个基础接口:
// 复合获取接口,整合异步+同步获取能力 abstract class GetIf implements AsyncGetIf, SyncGetIf {} // 复合写入接口,整合异步+同步写入能力 abstract class PutIf implements AsyncPutIf, SyncPutIf {}
3. 实现Fifo类
让Fifo实现复合接口(同时可继承NamedObject基类):
class NamedObject { final String name; NamedObject(this.name); } class Fifo extends NamedObject implements GetIf, PutIf { final int size; Fifo(String name, this.size) : super(name); // 实现所有接口方法 @override void get(int data) { // 异步获取逻辑实现 } @override bool empty() { // 判断空逻辑实现 return false; } @override bool tryGet(int data) { // 同步尝试获取逻辑实现 return true; } @override void put(int data) { // 异步写入逻辑实现 } @override bool full() { // 判断满逻辑实现 return false; } @override bool tryPut(int data) { // 同步尝试写入逻辑实现 return true; } }
4. 使用示例
和C++用法几乎一致,支持多接口类型引用,也可将复合接口转为基础接口:
void main() { final fifo = Fifo("test_fifo", 10); // 用不同接口引用实例 AsyncGetIf g1 = fifo; SyncGetIf g2 = fifo; GetIf g3 = fifo; int getData = 0; g1.get(getData); if (!g2.empty()) { g3.tryGet(getData); } // 复合接口转基础接口 AsyncGetIf g4 = g3; // 直接调用基础接口方法,无需强制转换 if ((g4 as SyncGetIf).empty()) { // 逻辑处理 } }
二、Mixin实现(适用于带默认实现的场景)
如果你的接口需要包含默认实现逻辑,可以用mixin实现,纯抽象接口场景下稍显冗余,但也可行:
1. 定义基础Mixin
mixin AsyncGetMixin { void get(int data); } mixin SyncGetMixin { bool empty(); bool tryGet(int data); } mixin AsyncPutMixin { void put(int data); } mixin SyncPutMixin { bool full(); bool tryPut(int data); }
2. 定义复合Mixin
mixin GetMixin on AsyncGetMixin, SyncGetMixin {} mixin PutMixin on AsyncPutMixin, SyncPutMixin {}
3. 实现Fifo类
class Fifo extends NamedObject with AsyncGetMixin, SyncGetMixin, AsyncPutMixin, SyncPutMixin implements GetMixin, PutMixin { final int size; Fifo(String name, this.size) : super(name); // 实现所有抽象方法 @override void get(int data) {} @override bool empty() => false; @override bool tryGet(int data) => true; @override void put(int data) {} @override bool full() => false; @override bool tryPut(int data) => true; }
内容的提问来源于stack exchange,提问作者Adam Rose
相关产品推荐
相关产品推荐

