枚举可以共享具体方法以避免重复吗?

问题描述 投票:0回答:2

我使用具有 [unit] 属性(枚举)的值对象。 我的枚举实现了一个接口,允许单位之间的转换(厘米到米,公斤到克等......)

像这样:

class Height {
  final double value;
  final DistanceUnit unit;
  
  const Height({required this.value, this.unit = DistanceUnit.cm});
}
// Directly implementing Enum so that only enums can implement this ; important for another method.
abstract interface class Convertible implements Enum {
  final double factor;

  Convertible({required this.factor});

  double getConversionFactor(covariant Convertible from, covariant Convertible to);
}

enum DistanceUnit implements Convertible {
  cm(factor: 1/100),
  m(factor: 1);
  
  @override
  final double factor;
  
  const DistanceUnit({required this.factor});
  
  @override
  double getConversionFactor(covariant Convertible from, covariant Convertible to) {
    return from.factor / to.factor;
  }
}

这工作得很好,但由于我有很多单位(面积、距离、体积、时间、质量......),它变得非常冗长和重复。 getConversionFactor() 方法始终相同...所以我们离 DRY 建议还很远!

我知道枚举继承自 Enum 并且不能扩展另一个类。但是有其他方法可以防止这种情况并优化我的代码吗?

flutter dart
2个回答
0
投票

我更愿意为此延期。

class MyModel {
  const MyModel(this.valueInCM);

  ///* in minimum  unite, e.g for your domain level,
  /// we can consider from cm, if needed you goes down too
  final double valueInCM;
}

extension MyModelExt on MyModel {
  double get toMeter => valueInCM / 100;
  double get toKM => valueInCM / 1000;
}

您还可以在 dart 中查看

Duration
课程。


0
投票

我无法在我的脑海中得到完整的案例,但如果正在寻找删除 getConversionFactor 最红的部分,你可以使用 mixin ,如下所示

class Height {
final double value;
final DistanceUnit unit;

const Height({required this.value, this.unit = DistanceUnit.cm});
}
// Directly implementing Enum so that only enums can implement this ; important for another method.
abstract interface class Convertible implements Enum {
final double factor;

Convertible({required this.factor});


}

enum DistanceUnit  with Conver implements Convertible{
cm(factor: 1/100),
m(factor: 1);

@override
final double factor;

const DistanceUnit({required this.factor});
}
mixin Conver  {
double getConversionFactor(covariant Convertible from, covariant Convertible to) {
 return from.factor / to.factor;
}
}
© www.soinside.com 2019 - 2024. All rights reserved.