如何在Dart中将Mixin类C设为sealed类并限制仅A类使用
Dart中限制Mixin类的使用范围
要实现将Mixin类C设为库外不可扩展、仅允许类A使用的需求,可结合Dart的库访问控制和Mixin限制机制处理,具体方案如下:
1. 把Mixin设为库私有
Dart中以下划线_开头的标识符属于库私有,外部库无法访问或扩展。先将C修改为_C,确保外部库无法直接操作它:
class A extends B with _C{} sealed class B{} mixin class _C{}
但此时库内其他类仍能使用_C,需要进一步限制仅A可使用。
2. 限制Mixin仅允许A使用
方案一:编译时安全限制(推荐)
创建一个库私有标记类_OnlyForA,让_C通过on关键字限定只能混入继承自该类的对象,再让A继承这个标记类:
class A extends B with _OnlyForA, _C {} sealed class B {} // 库私有标记类,仅A可继承 class _OnlyForA {} // Mixin仅允许混入继承自_OnlyForA的类 mixin class _C on _OnlyForA {}
这种方式是编译时检查,能从根源上禁止其他类使用_C,同时_OnlyForA是库私有,外部库也无法通过继承它来使用_C。
方案二:运行时检查
若不想额外创建标记类,可在_C的构造方法中检查当前实例类型是否为A:
class A extends B with _C{} sealed class B{} mixin class _C { _C() { if (this is! A) { throw StateError("Mixin _C仅允许类A使用"); } } }
该方式是运行时校验,虽不如编译时限制严格,但能快速实现需求。
最终推荐代码
优先选择编译时安全的方案一,代码如下:
class A extends B with _OnlyForA, _C {} sealed class B {} class _OnlyForA {} mixin class _C on _OnlyForA {}
内容的提问来源于stack exchange,提问作者Jaafar Melhem
相关产品推荐
相关产品推荐

