如何在Dart中将重写的函数设置为private?

h43kikqp  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(52)

有一个_操作符使属性私有。
例如:_hidden()
这会将属性隐藏在文件外部。
现在,如果我有一个Parent类,在文件parent.dart中有func()
一个ChildextendsParent类,在文件child.dart中定义。

// parent.dart
class Parent {
  void func() {
    print("parent");
  }
}

// child.dart
class Child extends Parent {
  
  // How to make this private
  @override
  void func(){
    super.func();
    print("child");
  }
}

字符串
如何在Child类中将被重写的func()函数设为私有?
Child类的func()函数中添加_不起作用,因为函数签名现在从Parent类的func()函数更改,因此它不再是重写函数,而是一个新函数。

iecba09b

iecba09b1#

当你创建某个类型的子类时,子类必须满足该类型的基本要求。换句话说,在你的例子中,Child必须实现与Parent类相同的属性和方法。
我已经学会了这是一个“是”的关系。
假设你有一个Duck的层次结构,在最低层有一个swim()方法,它派生自一个Bird类,类有fly(),类又有一个父类Animal,类有walk()
现在,如果你有一个Duck对象,你知道它可以swim,但你也知道它可以fly()(因为它是一只鸟)和walk()(因为它是一只动物)。
将父类的public方法设为private将违反“is a”规则,并且会破坏很多依赖于父类的代码。因此,虽然拥有一个拥有私有_hidden()方法的类Child是有效的,但该类不能从Parent派生,因为为了使某个类成为有效的父类,它必须有一个公共hidden()方法。
在我上面给出的例子中,DuckBird,为了成为Bird,你必须能够fly()。如果你想建模另一个也会游泳的动物,比如Fish,你应该给予这个类一个swim()方法,但不能从Bird类派生它。
正如@Qori评论的那样,如果你想从超类中实现一些方法,但不是所有方法,你会想看看Dart中的多态性,组合和interface definitions

相关问题