В Dart, как получить доступ к родительскому приватному var из подкласса в другом файле? - PullRequest
0 голосов
/ 05 ноября 2019

У меня есть два класса в Dart, MyClass1 и MyClass2, где MyClass2 расширяет MyClass1. В некоторых функциях MyClass2 я хочу получить доступ к переменной, которая имеет «личные» права доступа в MyClass1. Если MyClass1 и MyClass2 объявлены в одном и том же файле дротика, например:

class MyClass1 {
  double _myprivatevar;
}

class MyClass2 extends MyClass1 {

  MyClass2(double myvar){
    this._myprivatevar = myvar;
  }
}  

все в порядке. Но теперь, если MyClass2 объявлен в своем собственном файле дротика:

import 'package:test/myclass1.dart';

class MyClass2 extends MyClass1 {

  MyClass2 (double myvar){
    this._myprivatevar = myvar;
  }
}

Iесть ошибка:

Сеттер _myprivatevar не определен для класса «MyClass2». Попробуйте импортировать библиотеку, которая определяет '_myprivatevar', исправляя имя на имя существующего установщика, или определяя установщик или поле с именем '_myprivatevar'.dart (undefined_setter)

, как я могу решить этовыдавать и иметь доступ к родительской частной переменной из подкласса, определенного в другом файле dart?

1 Ответ

1 голос
/ 05 ноября 2019

Вы не можете напрямую получить доступ к частному имени из другой библиотеки, и у Dart нет записи о конфиденциальности, соответствующей «защищенному» (доступ из подклассов).

Вы должны либо сделать свойство общедоступным, объявитьдва класса в одной библиотеке, или нет доступа к свойству из подкласса. Других вариантов нет.

Если ваша единственная проблема - инициализация переменной экземпляра, то вы, возможно, могли бы передать значение переменной в качестве аргумента конструктора суперклассу, тем самым имея суперклассдоступ к переменной для вас:

class MyClass1 {
  double _myPrivateVar;
  MyClass1([double myPrivateValue]) : _myPrivateVar = myPrivateValue;
}
// In different library:
class MyClass2 extends MyClass1 {
  MyClass2(double myVar) : super(myVar);
}

Это не поможет вам прочитайте личную переменную позже, это все еще только суперкласс и другой код в той же библиотеке, который может получить доступпеременная.

...