Class 可以用Dart在抽象类中声明静态方法吗?

Class 可以用Dart在抽象类中声明静态方法吗?,class,static,dart,abstract,Class,Static,Dart,Abstract,在抽象类中,我希望定义静态方法,但我遇到了一些问题 在这个简单的例子中 抽象类Main{ 静态字符串获取名称; 布尔使用(元素el); } 类子类扩展主类{ 静态字符串get name=>testme; 布尔使用(元素el)=>(元素el为元素); } 我收到错误消息: 方法“get:name”静态字符串get-name需要函数体 声明中是否有输入错误,或者静态方法与抽象类不兼容?Dart不会将静态方法继承给派生类。因此,创建抽象静态方法(没有实现)是没有意义的 如果你想在类Main中使用一个

抽象类中
,我希望定义静态方法,但我遇到了一些问题

在这个简单的例子中

抽象类Main{
静态字符串获取名称;
布尔使用(元素el);
}
类子类扩展主类{
静态字符串get name=>testme;
布尔使用(元素el)=>(元素el为元素);
}
我收到错误消息:

方法“get:name”静态字符串get-name需要函数体


声明中是否有输入错误,或者静态方法与抽象类不兼容?

Dart不会将静态方法继承给派生类。因此,创建抽象静态方法(没有实现)是没有意义的

如果你想在类
Main
中使用一个静态方法,你必须在那里完全定义它,并且总是像
Main.name那样调用它

==编辑==

我肯定我读过或听过吉拉德·布拉卡关于它的一些争论,但现在找不到


这种行为在静态类型语言(我不知道很多动态语言)中很常见。静态方法类似于顶级函数,其中类名仅充当名称空间。静态方法与实例化对象无关,因此继承不适用。在静态方法被“继承”的语言中,这只是语法上的糖分。Dart喜欢在这里更加明确,避免混淆实例方法和静态方法(它们实际上不是方法,只是函数,因为它们不作用于实例)。这不是我的主要领域,但希望无论如何都有意义;-)

看起来您正在尝试“重写”静态方法。我不确定你在那里想要实现什么。我不知道有哪种OO语言支持这一点(也不知道它们是如何做到的)

Java中的类似问题可能有助于澄清

还请注意,在Java(和其他OO语言)中从类的实例引用静态被认为是不好的做法。有趣的是,我注意到Dart不允许您这样做,因此实际上完全消除了这种不良做法


因此,您甚至无法欺骗自己,让自己认为它在Dart中的行为是多态的,因为您无法从实例调用static

你知道不继承静态方法是否有理由吗?因为文本大小超过了最大注释长度,所以扩展了答案。@cYoung我想这会让人困惑而不是受益。可以通过使用反射来模拟静态继承,即通过调用超级类型的实现或按名称调用静态方法来获得“重写”行为。知道真正的答案会很有趣。Swift有带有关键字
class
的类型方法,这类似于static,但您可以覆盖它。是的,afaik Swift是唯一支持它的语言(以及许多其他革命性的东西)。此请求已打开以在Dart中支持此请求:。