0
abstract class ListController {

   int numberOfDocumentPerPage = 7;

}

然后使用抽象类

class EventListController extends ListController {


}

但是当我创建一个实例时,我可以将新值更改/分配给属性

final controller = EventListController();
controller.numberOfDocumentPerPage = 1000; // should be error in here

那么如何使属性只能从抽象类中读取?

更新:

我还需要修改 EventListController 类中的属性

4

1 回答 1

2

基本上,您希望基类声明一个公共 getter。我认为最简单的方法是:

abstract class ListController {
  static const defaultNumberOfDocumentPerPage = 7;

  int get numberOfDocumentPerPage => defaultNumberOfDocumentPerPage;
}

class EventListController extends ListController {
  int _numberOfDocumentPerPage = ListController.defaultNumberOfDocumentPerPage;

  @override
  int get numberOfDocumentPerPage => _numberOfDocumentPerPage;
}

如果您不想要单独的命名常量,您可以使用调用原始 getter 的结果显式初始化您的内部值:

abstract class ListController {
  final int numberOfDocumentPerPage = 7;
}

class EventListController extends ListController {
  EventListController() {
    _numberOfDocumentPerPage = super.numberOfDocumentPerPage;
  }
  
  // ignore: super_in_invalid_context, https://github.com/dart-lang/sdk/issues/46850
  late int _numberOfDocumentPerPage = super.numberOfDocumentPerPage;

  @override
  int get numberOfDocumentPerPage => _numberOfDocumentPerPage;
}

另一种方法是在基类中提供一个受保护的设置器:

import 'package:meta/meta.dart';

abstract class ListController {
  int _numberOfDocumentPerPage = 7;

  int get numberOfDocumentPerPage => _numberOfDocumentPerPage;

  @protected
  set numberOfDocumentPerPage(int value) => _numberOfDocumentPerPage = value;
}

但请注意,@protected注释只是为分析器提供了一个提示,以便它可以警告违规行为;它不会在编译时或运行时强制执行。

于 2021-08-08T06:58:36.950 回答