2014-01-23 1 views
3

Предположим, у меня есть класс, как это:Как получить значение поля по умолчанию в абстрактном классе

abstract class Foo { 
    String name bar = 'bar'; 
} 

Используя зеркало, мы можем получить значение bar?

+0

Зависит. У вас есть экземпляр этого класса? – MarioP

+0

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

+0

Верно, не думал о конструкторе здесь. Также понял, что я написал «экземпляр» вместо «подкласса». В любом случае экземпляр будет бесполезен. – MarioP

ответ

0

Общие ответы:

  • Вы можете использовать super.field, если вы расширяете класс и хотите получить доступ к его полям/добытчиками.
  • Если вы размышляете над декларацией класса, вы не можете в настоящее время наследовать какие-либо тела, включая тела методов или инициализаторы. Вам придется использовать анализатор или dart2js.
  • Dado - это ... интересно, как это работает. Он пытается создать экземпляр абстрактного класса и больше не работает.

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

Во-первых, подход с Dado был и довольно экспериментальный. Я пытался использовать языковые функции, чтобы требовать декларативного определения модулей, чтобы авторы не могли писать модули, которые не работали с генерацией кода. В Дарте и зеркалах произошли некоторые изменения, которые делают этот подход менее работоспособным или, по крайней мере, заставляют его требовать больше шаблонов, поэтому я переосмысливаю все это. Возьмите любую технику, которую вы найдете там с выгодой или двумя солями :)

Для всех, кто не смотрел образец или код, в Dado вы объявляете абстрактный класс для определения модуля. Поле со значением объявляет фиксированное одноэлементное значение, похожее на то, как более традиционный контейнер DI может написать вам bind(Foo).toValue(new Foo()).

Способ, которым я (используется) получить значение, путем создания экземпляра абстрактного класса через зеркала, а затем просто просто прочитать поле. dart: зеркала изменены, чтобы запретить создание экземпляров абстрактных классов, поэтому это больше не работает. Это печально, потому что другие типы привязок были объявлены абстрактными методами, и они вызывают предупреждения в не-абстрактных классах.