【问题标题】:Passing one random value to two super arguments将一个随机值传递给两个超级参数
【发布时间】:2020-07-12 17:40:04
【问题描述】:

基本上我想将随机参数两次传递给父类。


考虑以下示例:

import 'dart:math' as math;

class A {
  double a;
  double b;

  A(this.a, this.b) {
    if (a != b) {
      print('Error');
    } else {
      print('Alright');
    }
  }
}

class B extends A {
  B() : super(math.Random().nextDouble(), math.Random().nextDouble());
}

main() {
  B();
}

这是我能想到的唯一解决方案,但这感觉太老套了……我希望其他人可以为我提供更好的解决方案。

import 'dart:math' as math;

class A {
  double a;
  double b;

  A(this.a, this.b) {
    if (a != b) {
      print('Error');
    } else {
      print('Alright');
    }
  }
}

class B extends A {
  static List<double> _c = [0];
  bool uselessBool;

  B() : uselessBool = random(),
        super(_c[0], _c[0]);

  static bool random() {
    _c[0] = math.Random().nextDouble();
    return true;
  }
}

main() {
  B();
}

我可能存在的东西是这样的(例如你在 python 中所做的):

import 'dart:math' as math;

class A {
  double a;
  double b;

  A(this.a, this.b) {
    if (a != b) {
      print('Error');
    } else {
      print('Alright');
    }
  }
}

class B extends A {

  B() {
    var c = math.Random().nextDouble();
    super(c, c);
  }
}

main() {
  B();
}

【问题讨论】:

  • 认为最好的方法是为 A 创建一个单参数构造函数。
  • 我没有创建 A 类。在这个例子中我做了,但它是一个更大问题的简化。

标签: class inheritance dart super


【解决方案1】:

您可以通过创建以_ 开头的命名构造函数来创建隐藏构造函数。通过这样做,我们可以创建以下示例来满足您的需求:

import 'dart:math' as math;

class A {
  double a;
  double b;

  A(this.a, this.b) {
    if (a != b) {
      print('Error');
    } else {
      print('Alright');
    }
  }
}

class B extends A {
  B() : this._(math.Random().nextDouble());
  B._(double value) : super(value, value);
}

void main() {
  B();
}

如果您想要更复杂的逻辑,您还可以查看工厂构造函数,它基本上用作静态方法,但必须返回类的实例。

【讨论】:

  • 感谢就像一个魅力。我的 20+ 父级仍然有点奇怪,但比我建议的要好。我也去工厂看看。再次感谢
  • 如果您有 20 多个具有这种模式的父类,我建议您研究一下如何更改 A 的构造函数,以便更好地为您工作。你可以例如将 A 定义为 A(double value) : a = value, b = value 并通过这样做重用参数来定义类中的多个变量。
  • 对不起,我的意思是父类中有 20 多个参数。而且我不能真正改变 A 类,因为它是一个内置类(我可以,但它会让未来的维护者感到困惑)
  • 好的,我不知道你的问题的全部细节,所以我不能说是否有更好的解决方案适合你。 :)
  • 我知道你的回答在我的问题中是完美的,所以谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
  • 2014-08-06
相关资源
最近更新 更多