如何在Dart中调用第二个祖先方法

如何在Dart中调用第二个祖先方法,dart,Dart,可以在dart中调用第二个祖先方法吗?类似于super.super.hello()?如果可能的话,怎么写呢 A类{ void hello(){ 印刷品(‘A’); } } B类扩展了A类{ @凌驾 void hello(){ 印刷品(‘B’); } } C类扩展到B类{ @凌驾 void hello(){ //在这里如何调用类A中实现的hello()? } } void main(){ var c=c(); c、 你好; } 这是不可能的 不可能的原因是它打破了抽象。 当您查看class C e

可以在dart中调用第二个祖先方法吗?类似于
super.super.hello()
?如果可能的话,怎么写呢

A类{
void hello(){
印刷品(‘A’);
}
}
B类扩展了A类{
@凌驾
void hello(){
印刷品(‘B’);
}
}
C类扩展到B类{
@凌驾
void hello(){
//在这里如何调用类A中实现的hello()?
}
}
void main(){
var c=c();
c、 你好;
}
这是不可能的

不可能的原因是它打破了抽象。 当您查看
class C extend B
时,您需要了解的关于
B
的所有信息是其成员具有哪些签名以及实现了哪些接口。只要有效地保持不变,您的有效代码就会继续工作

考虑一下如果
B
的作者决定让自己成为助手基类会发生什么:

抽象类\u BaseB扩展了{
字符串get\u myName;
@凌驾
void hello(){
打印(_myName);
}
}
B类扩展了B类{
@凌驾
字符串get _myName=>“B”;
}
这是一个非常有效的重构。生成的类
B
具有所有相同的成员并实现所有相同的接口(还有
\u BaseB
,但它是私有的,因此没有人可以看到)

如果上面的
C
类只需调用
super.hello()
,它就可以继续工作。如果它有办法请求
super.super.hello()
,则可能不再有效

类似地,如果
B
类更改为:

B类实现了{
@凌驾
void hello(){
印刷品(“B”);
}
}
(更改
扩展为
实现
),则
B
的所有方法的工作原理与以前相同,并实现相同的接口。同样,对于
B
类的用户来说,没有明显的差异。 但是,如果您可以调用类似
A.super.hello()
的函数来访问
A
类的
hello
方法,那么现在就会中断,因为该方法根本不在
B
类中

因此,通过将
super.hello()
限制为只调用作为超类编写的精确类上的方法,可以防止在
B
的实现上引入依赖项,这些依赖项会使原本有效的重构变成破坏性的更改。

这是不可能的

不可能的原因是它打破了抽象。 当您查看
class C extend B
时,您需要了解的关于
B
的所有信息是其成员具有哪些签名以及实现了哪些接口。只要有效地保持不变,您的有效代码就会继续工作

考虑一下如果
B
的作者决定让自己成为助手基类会发生什么:

抽象类\u BaseB扩展了{
字符串get\u myName;
@凌驾
void hello(){
打印(_myName);
}
}
B类扩展了B类{
@凌驾
字符串get _myName=>“B”;
}
这是一个非常有效的重构。生成的类
B
具有所有相同的成员并实现所有相同的接口(还有
\u BaseB
,但它是私有的,因此没有人可以看到)

如果上面的
C
类只需调用
super.hello()
,它就可以继续工作。如果它有办法请求
super.super.hello()
,则可能不再有效

类似地,如果
B
类更改为:

B类实现了{
@凌驾
void hello(){
印刷品(“B”);
}
}
(更改
扩展为
实现
),则
B
的所有方法的工作原理与以前相同,并实现相同的接口。同样,对于
B
类的用户来说,没有明显的差异。 但是,如果您可以调用类似
A.super.hello()
的函数来访问
A
类的
hello
方法,那么现在就会中断,因为该方法根本不在
B
类中


因此,通过将
super.hello()
限制为只调用作为超类编写的精确类上的方法,可以防止在
B
的实现上引入依赖项,这些依赖项会使原本有效的重构变成破坏性的更改。

据我所知,这在Dart是不可能的。我希望永远不会。对于调试和重构来说,这将是一场噩梦。答案是java,但原理是一样的。据我所知,在Dart中这是不可能的。我希望永远不会。对于调试和重构来说,这将是一场噩梦。答案是java,但原则是一样的。