2014-01-13 4 views
1

Как бы я идти о делать что-то вроде этого:Передача функции в супер конструктор

class SubClass extends SuperClass { 
    List<String> text = []; 

    factory SubClass(bool debug) { 
     var func = (info) { if (debug) text.add(info); } 
     return SubClass._internal(func); 
    } 

    SubClass._internal(func) : super(func); 
} 

Я не могу понять, как его реализовать, любые предложения?

ответ

0

Я понял, что лучшее решение должен был реализовать класс и использовать делегирование для имитации функции.

class SubClass implements SuperClass { 
    Function _f; // dummy variable 
    SuperClass _delegate; 

    f(text) => _delegate.f(text); 

    List<String> text = []; 

    SubClass(bool debug) { 
    var func = (info) { if (debug) text.add(info); }; 

    _delegate = new SuperClass(func); 
    } 
} 

class SuperClass { 
    Function _f; 
    f(text) => _f(text); 

    SuperClass(this._f); 
} 

void main() { 
    var x = new SubClass(true); 
    x.f("info"); 
    x.f("more info"); 
    x.text.forEach((e) => print(e)); 
} 
0

Если вы определяете функцию в другом классе, вы можете выполнить проводку в заводском конструкторе, но только после создания экземпляра.

(Если класс имеет функцию вызова его можно рассматривать как функцию - см AddDebug класса)
Здесь новый AddDebug класса передается в конструктор и ссылка на текст передается после создания экземпляра. Я использовал абстрактный класс TextHolder как интерфейс.

Если вы определяете функцию inline, это статический метод, который не может ссылаться на экземпляры экземпляра.

Здесь два решения, как вы могли это сделать. Если вы закомментировать // alternative линии вы получаете второе решение,

library x; 

class SuperClass { 
    Function _f; 
    SuperClass(this._f); 
    Function get f => _f; 

    void set f(Function f) { // alternative 
    _f = f;    // 
    }      // 
} 

abstract class TextHolder { 
    List<String> text; 
} 

class SubClass extends SuperClass implements TextHolder { 
    List<String> text = []; 

    factory SubClass([bool debug = false]) { 
    var ad = new AddDebug(true); 
    var nsc = new SubClass._internal(ad); 
    ad.textHolder = nsc; 

    nsc.f = new AddDebug2(nsc.text, true); // alternative 
    return nsc; 
    } 

    SubClass._internal(func) : super(func); 
} 


void main(List<String> args) { 
    var x = new SubClass(true); 
    x.f("sometext"); 
    x.f("anothertext"); 
    x.text.forEach((e) => print(e)); 
} 


class AddDebug implements Function { 
    bool _debug; 
    AddDebug([this._debug = false]); 

    TextHolder textHolder; 

    call(info) { 
    if(_debug) { 
     textHolder.text.add(info); 
    } 
    } 
} 

// alternative (entire class) 
class AddDebug2 implements Function { 
    bool _debug; 
    AddDebug2(this._text, [this._debug = false]); 

    List<String> _text; 

    call(info) { 
    if(_debug) { 
     _text.add(info); 
    } 
    } 
} 
0

только кажется, синтаксических ошибок мне попробовать это, я добавил точку с запятой и new

class SubClass extends SuperClass { 
    List<String> text = []; 

    factory SubClass(bool debug) { 
    var func = (info) { if (debug) text.add(info); };  
    return new SubClass._internal(func); 
    } 

    SubClass._internal(func) : super(func); 
} 
+1

Проблема более тонкая. Конструктор фабрики не может получить доступ к элементу 'test' объекта, который он еще не создал. –

Смежные вопросы