【问题标题】:Is it possible to extend a class with a default private constructor in Dart?是否可以在 Dart 中使用默认的私有构造函数扩展一个类?
【发布时间】:2018-12-04 21:03:02
【问题描述】:

假设我们有一个class a:

class A {
  A._();
}

它的默认构造函数是私有的:A._().

有没有办法extends那个班级?

问题

class B extends A {

}

这会导致编译器错误:

The superclass 'A' doesn't have a zero argument constructor.

尝试为 B 我自己 (B()) 编写 any 构造函数会导致另一个错误:

The superclass 'A' doesn't have an unnamed constructor.

【问题讨论】:

  • 如果你写了一个构造函数,这个类不会得到一个默认构造函数(隐含的A():super();构造函数,否则会被添加)。 A._ 构造函数不是“默认构造函数”,也不是未命名的构造函数。你仍然可以在类中添加一个未命名的构造函数A();。
  • @lrn Default constructor 是我为它找到的术语。通常它是A(),但是一旦添加了A._(),它就会被删除。因此A 既没有 public 零参数也没有未命名的构造函数。 A() 将是零参数且未命名。

标签: dart


【解决方案1】:

不,没有办法。这是防止扩展的有效方法。

你仍然可以做的是实现类。

class B implements A {}

如果类也有一个公共的非工厂构造函数,你仍然可以通过将构造函数调用转发给超类的这样一个命名的构造函数来扩展它。

class B extends A {
  B() : super.other();
}

【讨论】:

  • 太糟糕了。有什么理由阻止延期?我注意到实施是可能的,但这不是我想要的。另外,我将使用 PascalCase 调整我的问题。我自己写了这些错误消息。我并没有真正命名类 a 和 b。
  • 大多数严肃的编程语言都允许stackoverflow.com/questions/10170633/…。一个类有很多东西不能保证什么时候可以扩展。
  • 扩展只会添加功能,还是我错了?如果不打算扩展该类,则无论如何都不需要覆盖,并且可以将他们想要的内容添加到该类中。我也不明白为什么编译器会强制执行隐私。忽略它是我自己的责任。
  • 扩展可以添加或破坏它。 :) 取决于实现。
  • “忽略它是我自己的责任”。如果开发人员不希望他的类以妨碍它们正常工作的方式使用,他应该有权力。如果这使您无法使用包,请提出问题以使作者知道。不是每个人都想要一个类似 JavaScript 的世界,每个人都可以做他想做的事,然后在互联网上充斥着抱怨、错误报告和错误代码;-)
猜你喜欢
  • 2020-10-21
  • 2011-11-05
  • 1970-01-01
  • 2010-11-03
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
  • 1970-01-01
  • 2013-07-29
相关资源
最近更新 更多